我们的 ETL 流程有一个长时间运行的 SELECT INTO 语句,它动态地创建一个表,并用数亿条记录填充它。
该声明看起来像 SELECT ... INTO DestTable FROM SrcTable
出于监控目的,我们希望大致了解此语句在执行时的进度(大约行计数、写入的字节数或类似内容)。
我们尝试了以下方法无济于事:
-- 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')
Run Code Online (Sandbox Code Playgroud)
此外,我们可以在 中看到事务sys.dm_tran_active_transactions,但我无法找到一种方法来获取给定的受影响行数transaction_id(类似于@@ROWCOUNT也许,但带有transaction_idas 参数)。
我知道在 SQL Server 上,SELECT INTO 语句是 DDL 和 DML 语句合二为一,因此,隐式表创建将是一个锁定操作。我仍然认为必须有一些聪明的方法来在语句运行时获取某种进度信息。