Nosso fluxo de ETL possui uma instrução SELECT INTO de longa duração, que cria uma tabela rapidamente e a preenche com várias centenas de milhões de registros.
A declaração parece algo como SELECT ... INTO DestTable FROM SrcTable
Para fins de monitoramento, gostaríamos de ter uma idéia aproximada do progresso dessa instrução enquanto ela está sendo executada (aproximadamente número de linhas, número de bytes gravados ou semelhante).
Tentamos o seguinte sem sucesso:
-- Is blocked by the SELECT INTO statement:
select count(*) from DestTable with (nolock)
-- Returns 0, 0:
select rows, rowmodctr
from sysindexes with (nolock)
where id = object_id('DestTable')
-- Returns 0:
select rows
from sys.partitions
where object_id = object_id('DestTable')
Além disso, podemos ver a transação sys.dm_tran_active_transactions
, mas não consegui encontrar uma maneira de obter a contagem de linhas afetadas em um dado transaction_id
(algo semelhante a @@ROWCOUNT
talvez, mas com o transaction_id
argumento as).
Entendo que no SQL Server a instrução SELECT INTO é uma instrução DDL e DML em uma e, como tal, a criação implícita da tabela será uma operação de bloqueio. Ainda acho que deve haver uma maneira inteligente de obter algum tipo de informação sobre o progresso enquanto a instrução está sendo executada.