Como obter um desempenho preciso da consulta?

9

Estou tentando melhorar o desempenho de um procedimento armazenado. Quando executo o SP, ele termina quase instantaneamente, como se algo estivesse em cache. Disseram-me para usar as duas linhas a seguir do SQL antes de executar o SP no SSMS:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Quando executo o SP com as duas linhas de código acima, o SP termina em cerca de 8 segundos. No entanto, isso realmente está me dando tempo de execução real (como se eu o executasse em um aplicativo)? Como eu sei?

OO
fonte

Respostas:

9

Esses comandos fazem duas coisas:

  • Limpe o cache da página, que armazena as páginas de dados que já foram recuperadas do disco (normalmente o maior fator no tempo em uma consulta é o acesso ao disco)
  • Limpe o cache do plano de consulta, o que significa que o servidor precisa criar um novo plano de consulta. Normalmente, isso não é significativo, exceto por volumes de transações muito altos.

Você está basicamente tendo um tempo equivalente ao cenário "pior dos casos" - você acabou de reiniciar o servidor e nada está na memória. Execuções subsequentes não precisam pagar o custo para extrair os dados do disco, pois essas páginas já estão carregadas na memória.

Isso é semelhante a uma situação do mundo real - seu primeiro usuário a executar uma consulta específica provavelmente terá que esperar mais do que nas execuções subsequentes, supondo que você esteja verificando os mesmos dados.

Um bom método que eu gosto de usar é executar várias vezes e fazer uma média. Isso é especialmente útil em um ambiente compartilhado, pois você não tem controle total sobre recursos compartilhados, como tempdb.

Você também pode usar estes comandos para obter mais informações sobre o que realmente está acontecendo nos bastidores:

SET STATISTICS IO ON
SET STATISTICS TIME ON

Isso fornecerá informações detalhadas sobre leituras de páginas do disco (por objeto), leituras lógicas de páginas, tempo gasto na compilação de um plano e tempo gasto na execução de uma consulta.

JNK
fonte
excelente resposta como de costume JNK.
OO
Feliz por ajudar! Você acabou de fazer perguntas sobre coisas com as quais eu lidei muito. Se você perguntar sobre a replicação ou gerenciamento de memória que eu não tenho muito a acrescentar :)
JNK
2
Eu sabia sobre o SET STATISTICS IO ON, mas nunca sabia sobre o SET STATISTICS TIME ON. Obrigado JNK.
datagod
2
Apenas para sua informação, você pode obter muitas dessas informações sem todas as configurações de SET, gerando planos reais usando o SQL Sentry Plan Explorer. E para obter várias execuções (digamos, 5), você pode simplesmente finalizar o lote GO 5como no SSMS. É um download gratuito, não estou tentando vender nada. sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand
11
@JNK bem, claro, é grátis, economiza tempo e mostra informações impossíveis ou muito complicadas de sair do Management Studio. E eu trabalho lá. :-)
Aaron Bertrand