Le T-SQL suivant prend environ 25 secondes sur ma machine avec 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;
Il cumule 532 ms d' ASYNC_NETWORK_IO
attente selon les deux sys.dm_exec_session_wait_stats
et sys.dm_os_wait_stats
. Le temps d'attente total augmente à mesure que le nombre d'itérations de boucle augmente. En utilisant l' wait_completed
événement étendu, je peux voir que l'attente se produit environ toutes les 43 ms, à quelques exceptions près:
De plus, je peux obtenir les piles d'appels qui se produisent juste avant l' ASYNC_NETWORK_IO
attente:
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
Enfin, j'ai remarqué que SSMS utilise une quantité surprenante de CPU pendant la boucle (environ la moitié d'un cœur en moyenne). Je ne peux pas comprendre ce que SSMS fait pendant ce temps.
Pourquoi une simple boucle provoque-t-elle des ASYNC_NETWORK_IO
attentes lorsqu'elle est exécutée via SSMS? La seule sortie que je semble obtenir du client à partir de cette exécution de requête est la "Commande terminée avec succès". message.
la source