Das folgende T-SQL dauert auf meinem Computer mit SSMS v17.9 ungefähr 25 Sekunden:
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;
Es kumuliert 532 ms ASYNC_NETWORK_IO
Wartezeit nach beiden sys.dm_exec_session_wait_stats
und sys.dm_os_wait_stats
. Die Gesamtwartezeit erhöht sich mit zunehmender Anzahl von Schleifeniterationen. Anhand des wait_completed
erweiterten Ereignisses kann ich feststellen, dass das Warten mit wenigen Ausnahmen ungefähr alle 43 ms erfolgt:
Außerdem kann ich die Anrufstapel abrufen, die unmittelbar vor dem ASYNC_NETWORK_IO
Warten auftreten:
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
Schließlich ist mir aufgefallen, dass SSMS während der Schleife überraschend viel CPU verbraucht (durchschnittlich etwa einen halben Kern). Ich kann nicht herausfinden, was SSMS während dieser Zeit tut.
Warum wartet eine einfache Schleife, ASYNC_NETWORK_IO
wenn sie über SSMS ausgeführt wird? Die einzige Ausgabe, die ich bei dieser Abfrageausführung vom Client zu erhalten scheine, sind die "Befehle erfolgreich ausgeführt". Botschaft.