Cenário
Eu executo uma consulta longa e complexa que retorna mais de 30 campos e mais de 77.000 linhas no SSMS. Os resultados estão na grade. Os resultados são todos com muito texto. A grade SSMS começa a ser preenchida com resultados após alguns segundos (3 a 4) segundos, mas o tempo de execução da consulta é de 2 minutos. A maior parte desses 2 minutos são resultados anexados à grade no SSMS.
Questões)
Quando a consulta foi "concluída"? Isso foi feito nos primeiros 3 a 4 segundos quando as linhas começaram a ser anexadas à grade do SSMS? O restante dos 1 minuto e 56 segundos é apenas a atualização da interface do usuário da grade com os resultados? Se a consulta estiver "concluída" após 3 a 4 segundos, não devo tentar otimizá-la, correto? Por outro lado, se a consulta não for feita até que a execução pare no SSMS (os dois minutos completos), devo poder otimizá-la.
Isso é feito quando o cliente recebe o último pacote de resultados da consulta do servidor.
Se o cliente estiver consumindo lentamente os resultados, isso atrasará a execução geral da consulta e ela será suspensa em espera
ASYNC_NETWORK_IO
.A consulta não é concluída e os resultados são armazenados em algum lugar e só então os envia. Portanto, certamente ver alguns resultados após 3-4 segundos não é uma indicação de que a consulta está "Concluída".
por exemplo, executei o seguinte no SSMS com "Estatísticas de consulta ao vivo" e "Plano de execução real" ativados.
Os resultados começaram a aparecer na grade mais ou menos imediatamente.
Quando concluído, as estatísticas de tempo de consulta no plano de execução real mostraram um tempo decorrido de
80,668
ms com as estatísticas de espera no mesmo plano mostrando60,184
ms deASYNC_NETWORK_IO
esperaVisualizar o plano de execução ao vivo enquanto ele estava em execução mostra que as linhas ainda estão fluindo dos operadores do plano de execução até o final (por exemplo, abaixo está como ficou depois de um minuto para mim, quando ele retornou 16.393 linhas)
Se a consulta acima estiver sendo executada em um nível de isolamento, exigindo que ela mantenha os bloqueios até o final da instrução, isso significará que os bloqueios serão mantidos abertos por mais tempo devido à lentidão do cliente.
A consulta acima não possui operadores de "bloqueio", portanto, no caso acima, as linhas começam a ser transmitidas para o cliente mais ou menos imediatamente.
Para saber mais sobre isso, você pode ver uma pergunta relacionada, mas inversa, sobre " Quando os resultados da consulta começam "
Outra coisa boa a se observar (já que você está perguntando isso em relação ao ajuste de desempenho) é que você pode descartar os resultados de uma consulta em SSMS . Fazer isso ajudará você a ver com mais precisão qual é o tempo de execução de uma consulta, excluindo o tempo de renderização do consumidor/cliente, etc. Normalmente ligo isso quando estou mais interessado no tempo de execução da consulta em si: