Nasz przepływ ETL ma długo działającą instrukcję SELECT INTO, która tworzy tabelę w locie i zapełnia ją setkami milionów rekordów.
Oświadczenie wygląda mniej więcej tak SELECT ... INTO DestTable FROM SrcTable
Do celów monitorowania chcielibyśmy uzyskać ogólne pojęcie o postępie wykonywania tej instrukcji podczas jej wykonywania (przybliżona liczba wierszy, liczba zapisanych bajtów lub podobna).
Wypróbowaliśmy następujące bezskutecznie:
-- 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')
Co więcej, widzimy transakcję sys.dm_tran_active_transactions
, ale nie byłem w stanie znaleźć sposobu, aby uzyskać liczbę dotkniętych wierszy w danym transaction_id
(może coś podobnego do @@ROWCOUNT
, ale z transaction_id
argumentem as).
Rozumiem, że na SQL Server instrukcja SELECT INTO jest zarówno instrukcją DDL, jak i DML w jednym, i jako takie, niejawne tworzenie tabeli będzie operacją blokującą. Nadal uważam, że musi istnieć jakiś sprytny sposób na uzyskanie pewnego rodzaju informacji o postępie podczas działania instrukcji.