Наш потік 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
аргументом як).
Я розумію, що на SQL Server оператор SELECT INTO - це і оператор DDL, і DML в одному, і як таке створення неявного створення таблиці буде операцією блокування. Я все ще думаю, що під час запуску заявки повинен бути розумний спосіб отримати якусь інформацію про прогрес.