Unser ETL-Flow verfügt über eine langjährige SELECT INTO-Anweisung, mit der eine Tabelle im laufenden Betrieb erstellt und mit mehreren hundert Millionen Datensätzen gefüllt wird.
Die Aussage sieht ungefähr so aus SELECT ... INTO DestTable FROM SrcTable
Zu Überwachungszwecken möchten wir uns einen ungefähren Überblick über den Fortschritt dieser Anweisung während der Ausführung verschaffen (ca. Zeilenanzahl, Anzahl der geschriebenen Bytes oder ähnliches).
Wir haben Folgendes erfolglos versucht:
-- 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')
Außerdem können wir die Transaktion in sehen sys.dm_tran_active_transactions
, aber ich konnte keine Möglichkeit finden, die Anzahl der betroffenen Zeilen in einer gegebenen zu ermitteln transaction_id
(etwas Ähnliches wie @@ROWCOUNT
vielleicht, aber mit dem transaction_id
Argument as).
Ich verstehe, dass auf SQL Server die SELECT INTO-Anweisung sowohl eine DDL- als auch eine DML-Anweisung in einer ist, und als solche wird die implizite Tabellenerstellung eine Sperroperation sein. Ich denke immer noch, dass es eine clevere Möglichkeit geben muss, eine Art Fortschrittsinformation zu erhalten, während die Anweisung ausgeführt wird.