El siguiente T-SQL tarda unos 25 segundos en mi máquina con 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;
Acumula 532 ms de ASYNC_NETWORK_IO
esperas según ambos sys.dm_exec_session_wait_stats
y sys.dm_os_wait_stats
. El tiempo de espera total aumenta a medida que aumenta el número de iteraciones de bucle. Usando el wait_completed
evento extendido, puedo ver que la espera ocurre aproximadamente cada 43 ms con algunas excepciones:
Además, puedo obtener las pilas de llamadas que ocurren justo antes de la ASYNC_NETWORK_IO
espera:
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
Finalmente, noté que SSMS usa una sorprendente cantidad de CPU durante el ciclo (aproximadamente medio núcleo en promedio). No puedo entender qué hace SSMS durante ese tiempo.
¿Por qué un bucle simple causa ASYNC_NETWORK_IO
esperas cuando se ejecuta a través de SSMS? El único resultado que parezco obtener del cliente de esta ejecución de consulta es "Comandos completados correctamente". mensaje.
fuente