โฟลว์ ETL ของเรามีคำสั่ง SELECT INTO ที่ดำเนินมายาวนานซึ่งสร้างตารางได้ทันทีและเติมข้อมูลด้วยหลายร้อยล้านเรคคอร์ด
คำสั่งมีลักษณะเหมือน SELECT ... INTO DestTable FROM SrcTable
เพื่อจุดประสงค์ในการตรวจสอบเราต้องการทราบคร่าวๆเกี่ยวกับความคืบหน้าของคำสั่งนี้ในขณะที่มันกำลังดำเนินการ (ประมาณ rowcount จำนวนไบต์ที่เขียนหรือคล้ายกัน)
เราได้ลองทำสิ่งต่อไปนี้โดยไม่มีประโยชน์:
-- 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 ในที่เดียวและเช่นนี้การสร้างตารางโดยนัยจะเป็นการดำเนินการล็อค ฉันยังคิดว่าต้องมีวิธีที่ชาญฉลาดในการรับข้อมูลความคืบหน้าบางอย่างในขณะที่คำสั่งกำลังทำงานอยู่