Наш поток 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')
Кроме того, мы можем видеть транзакцию sys.dm_tran_active_transactions
, но я не смог найти способ получить количество затронутых строк в заданном transaction_id
(что-то похожее на @@ROWCOUNT
возможно, но с transaction_id
аргументом as).
Я понимаю, что на SQL Server оператор SELECT INTO является одновременно оператором DDL и DML, и поэтому создание неявных таблиц будет операцией блокировки. Я все еще думаю, что должен быть какой-то умный способ получить какую-то информацию о прогрессе во время выполнения оператора.