Estou tentando melhorar o desempenho de um procedimento armazenado. Quando executo o SP, ele termina quase instantaneamente, como se algo fosse armazenado em cache. Disseram-me para usar as duas linhas de SQL a seguir 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 está realmente me dando o tempo de execução real (como se eu executasse isso de um aplicativo)? Como eu sei?
Esses comandos fazem duas coisas:
Você está basicamente obtendo um tempo equivalente ao cenário do "pior caso" - você acabou de reiniciar o servidor e não há nada na memória. As 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 determinada consulta provavelmente terá que esperar mais do que nas execuções subsequentes, supondo que você esteja verificando os mesmos dados.
Um bom método que 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:
Isso fornecerá informações detalhadas sobre leituras de páginas do disco (por objeto), leituras de páginas lógicas, tempo gasto compilando um plano e tempo gasto executando uma consulta.