Nuestro flujo ETL tiene una instrucción SELECT INTO de larga duración, que crea una tabla sobre la marcha y la completa con varios cientos de millones de registros.
La declaración se parece a algo como SELECT ... INTO DestTable FROM SrcTable
Para fines de monitoreo, nos gustaría tener una idea aproximada del progreso de esta declaración, mientras se ejecuta (recuento de filas, número de bytes escritos o similar).
Intentamos lo siguiente en vano:
-- 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')
Además, podemos ver la transacción en sys.dm_tran_active_transactions
, pero no pude encontrar una manera de obtener el recuento de filas afectadas en un determinado transaction_id
(algo similar a @@ROWCOUNT
quizás, pero con el transaction_id
argumento como).
Entiendo que en SQL Server, la instrucción SELECT INTO es tanto una instrucción DDL como una DML en una, y como tal, la creación implícita de la tabla será una operación de bloqueo. Todavía creo que debe haber alguna forma inteligente de obtener algún tipo de información de progreso mientras se ejecuta la declaración.