Estoy solucionando problemas de rendimiento en un procedimiento almacenado de varias declaraciones en SQL Server. Quiero saber en qué parte (s) debo pasar el tiempo.
Comprendo ¿Cómo leo el costo de la consulta? ¿Es siempre un porcentaje? que incluso cuando se le dice al SSMS que incluya un plan de ejecución real , las cifras del "costo de la consulta (en relación con el lote)" todavía se basan en estimaciones de costos , que pueden estar muy lejos de los reales
Por Medición del rendimiento de la consulta: "Costo de la consulta del plan de ejecución" frente a "Tiempo de espera" , puedo rodear la invocación del procedimiento almacenado con SET STATISTICS TIME
declaraciones, y luego obtendré una lista como esta en el Messages
panel:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
[etc]
SQL Server Execution Times:
CPU time = 187 ms, elapsed time = 206 ms.
con un mensaje de salida para cada declaración.
Puedo 'fácilmente' (aunque no convenientemente) asociar el resultado de las estadísticas de tiempo con los planes de ejecución de declaración por declaración en el panel del plan de ejecución, contándolos: el cuarto SQL Server Execution Times
mensaje de salida corresponde al Query 4
panel del plan de ejecución, y así sucesivamente.
Pero hay una manera mejor?
Duration
yCPU
resultados son reales en lugar de estimaciones, ¿sí?Una buena forma de hacerlo es con Profiler. Configure una "reproducción" de su proceso problemático en un cuadro de desarrollo o prueba, es decir, una llamada de muestra al proceso con parámetros. Luego, utilizando Profiler, cree una traza utilizando la plantilla TSQL_SPs o, desde una plantilla en blanco, agregue el evento SP: StmtCompleted. Agregue las columnas Duración, Lecturas, Escrituras y CPU si aún no están disponibles. Agregue un filtro a la traza en su SPID (que debe conocer de Management Studio). También puede agregar un filtro a Duración (por ejemplo, mayor que 1000 = mayor que 1 segundo).
Puede ejecutar el rastreo en Profiler aunque haya una sobrecarga (NO haga esto en un cuadro de producción) o exportar la definición y crear un rastreo del lado del servidor. La sobrecarga de Profiler no es un gran problema en un dev dedicado o cuadro de prueba.
Ejecute el proceso y deje que se complete. También puede elegir el plan de ejecución real en este momento.
Detenga su rastreo y abra el archivo, y debería ver un desglose línea por línea de su proceso, incluidos los tiempos para cada paso. Encuentro esto más útil que el plan para identificar cuellos de botella, aunque el plan será útil al mirar las secciones relevantes para ajustar.
HTH
fuente
También puede usar las vistas de administración dinámica sys.dm_exec_procedure_stats y sys.dm_exec_query_stats . El primero de ellos brinda información sobre el procedimiento en su conjunto; el segundo puede usarse para dividir cada consulta en el procedimiento. A continuación se muestra un ejemplo:
Estadísticas de procedimiento:
Consultas dentro del procedimiento:
fuente