T-SQL ต่อไปนี้ใช้เวลาประมาณ 25 วินาทีในเครื่องของฉันด้วย SSMS v17.9:
DECLARE @outer_loop INT = 0,
@big_string_for_u VARCHAR(8000);
SET NOCOUNT ON;
WHILE @outer_loop < 50000000
BEGIN
SET @big_string_for_u = 'ZZZZZZZZZZ';
SET @outer_loop = @outer_loop + 1;
END;
มันสะสม 532 มิลลิวินาทีของASYNC_NETWORK_IO
รอตามทั้งสองและsys.dm_exec_session_wait_stats
sys.dm_os_wait_stats
เวลารอทั้งหมดจะเพิ่มขึ้นตามจำนวนการวนซ้ำที่เพิ่มขึ้น เมื่อใช้wait_completed
เหตุการณ์ที่ขยายออกไปฉันจะเห็นว่าการรอเกิดขึ้นประมาณทุกๆ 43 มิลลิวินาทีโดยมีข้อยกเว้นบางประการ:
นอกจากนี้ฉันจะได้รับสแต็คการโทรที่เกิดขึ้นก่อนASYNC_NETWORK_IO
รอ:
sqldk.dll!SOS_DispatcherBase::GetTrack+0x7f6c
sqldk.dll!SOS_Scheduler::PromotePendingTask+0x204
sqldk.dll!SOS_Task::PostWait+0x5f
sqldk.dll!SOS_Scheduler::Suspend+0xb15
sqllang.dll!CSECCNGProvider::GetBCryptHandleFromAlgID+0xf6af
sqllang.dll!CSECCNGProvider::GetBCryptHandleFromAlgID+0xf44c
sqllang.dll!SNIPacketRelease+0xd63
sqllang.dll!SNIPacketRelease+0x2097
sqllang.dll!SNIPacketRelease+0x1f99
sqllang.dll!SNIPacketRelease+0x18fe
sqllang.dll!CAutoExecuteAsContext::Restore+0x52d
sqllang.dll!CSQLSource::Execute+0x151b
sqllang.dll!CSQLSource::Execute+0xe13
sqllang.dll!CSQLSource::Execute+0x474
sqllang.dll!SNIPacketRelease+0x165d
sqllang.dll!CValOdsRow::CValOdsRow+0xa92
sqllang.dll!CValOdsRow::CValOdsRow+0x883
sqldk.dll!ClockHand::Statistic::RecordClockHandStats+0x15d
sqldk.dll!ClockHand::Statistic::RecordClockHandStats+0x638
sqldk.dll!ClockHand::Statistic::RecordClockHandStats+0x2ad
sqldk.dll!SystemThread::MakeMiniSOSThread+0xdf8
sqldk.dll!SystemThread::MakeMiniSOSThread+0xf00
sqldk.dll!SystemThread::MakeMiniSOSThread+0x667
sqldk.dll!SystemThread::MakeMiniSOSThread+0xbb9
ในที่สุดฉันสังเกตเห็นว่า SSMS ใช้ซีพียูในปริมาณที่น่าประหลาดใจในระหว่างการวนรอบ ฉันไม่สามารถทราบได้ว่า SSMS กำลังทำอะไรในช่วงเวลานั้น
เหตุใดจึงทำให้การวนรอบแบบง่ายASYNC_NETWORK_IO
รอเมื่อดำเนินการผ่าน SSMS ผลลัพธ์เดียวที่ฉันได้รับจากลูกค้าจากการดำเนินการค้นหานี้คือ "คำสั่งเสร็จสมบูรณ์แล้ว" ข่าวสาร