SSMS v17.9가 설치된 시스템에서 다음 T-SQL은 약 25 초가 걸립니다.
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;
와 ASYNC_NETWORK_IO
모두에 따라 532ms의 대기 시간 이 누적 됩니다. 루프 반복 횟수가 증가하면 총 대기 시간이 늘어납니다. 확장 이벤트를 사용하면 몇 가지 예외를 제외하고 대략 43ms마다 대기가 발생한다는 것을 알 수 있습니다.sys.dm_exec_session_wait_stats
sys.dm_os_wait_stats
wait_completed
또한 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는 루프 동안 (평균 코어의 절반 정도) 놀라운 양의 CPU를 사용하는 것으로 나타났습니다. 그 시간 동안 SSMS가 무엇을하고 있는지 알 수 없습니다.
ASYNC_NETWORK_IO
SSMS를 통해 실행될 때 단순한 루프로 인해 대기가 발생하는 이유는 무엇 입니까? 이 쿼리 실행에서 클라이언트로부터 얻은 유일한 출력은 "명령이 성공적으로 완료되었습니다." 메시지.