¿Cómo obtener un rendimiento de consulta preciso?

9

Estoy intentando mejorar el rendimiento de un procedimiento almacenado. Cuando ejecuto el SP, termina casi instantáneamente, como si algo estuviera en caché. Me dijeron que usara las siguientes dos líneas de SQL antes de ejecutar el SP en SSMS:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Cuando ejecuto el SP con las dos líneas de código arriba, el SP termina en unos 8 segundos. Sin embargo, ¿esto realmente me da el tiempo de ejecución real (como si ejecuto esto desde una aplicación)? ¿Cómo puedo saber?

OO
fuente

Respuestas:

9

Esos comandos hacen dos cosas:

  • Borre la memoria caché de la página, que almacena páginas de datos que ya se han recuperado del disco (normalmente el factor más importante en el tiempo en una consulta es el acceso al disco)
  • Borre la caché del plan de consulta, lo que significa que el servidor necesita crear un nuevo plan de consulta. Esto normalmente no es significativo, excepto para volúmenes de transacciones muy altos.

Básicamente, está obteniendo un tiempo equivalente al "peor de los casos": acaba de reiniciar el servidor y no hay nada en la memoria. Las ejecuciones posteriores no necesitan pagar el costo para extraer los datos del disco ya que esas páginas ya están cargadas en la memoria.

Esto es similar a una situación del mundo real: es probable que su primer usuario que ejecute una consulta en particular tenga que esperar más tiempo que en las ejecuciones posteriores, suponiendo que esté verificando los mismos datos.

Un buen método que me gusta usar es correr varias veces y tomar un promedio. Esto es especialmente útil en un entorno compartido ya que no tiene control total sobre los recursos compartidos como tempdb.

También puede usar estos comandos para obtener más información sobre lo que realmente sucede detrás de escena:

SET STATISTICS IO ON
SET STATISTICS TIME ON

Estos le proporcionarán información detallada sobre las lecturas de página del disco (por objeto), las lecturas lógicas de página, el tiempo dedicado a compilar un plan y el tiempo dedicado a ejecutar una consulta.

JNK
fuente
excelente respuesta como siempre JNK.
OO
¡Feliz de ayudar! Simplemente estás haciendo preguntas sobre cosas que he tratado mucho. Si preguntas sobre la replicación o la administración de memoria, no tendré mucho que agregar :)
JNK
2
Sabía acerca de SET STATISTICS IO ON, pero nunca supe acerca de SET STATISTICS TIME ON. Gracias JNK
datagod
2
Solo para su información, puede obtener mucha de esta información sin todas las configuraciones de SET al generar planes reales utilizando el Explorador de planes de SQL Sentry. Y para obtener varias ejecuciones (digamos, 5), simplemente puede finalizar el lote con el GO 5mismo SSMS. Es una descarga gratuita, no estoy tratando de venderte nada. sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand
1
@JNK bueno, claro, es gratis, ahorra tiempo y muestra información que es imposible o muy engorrosa de sacar de Management Studio. Y yo trabajo allí. :-)
Aaron Bertrand