Cómo perfilar procedimientos almacenados

26

Estoy usando SQL Server 2012 y me preguntaba cómo perfilar los procedimientos almacenados

Por ejemplo, ¿puede el generador de perfiles capturar cada instrucción SQL individual en un procedimiento almacenado, qué es y cuánto tiempo tarda en ejecutarse, etc.?

Estoy tratando de diagnosticar procedimientos almacenados de replicación de fusión, y esto debe capturarse como parte de una ejecución completa del agente de fusión. No parece posible tomar el procedimiento almacenado con problemas de rendimiento y ejecutarlo nuevamente porque en ese momento no es lento.

Peter
fuente

Respuestas:

27

La respuesta de Kevin describe qué eventos capturar en SQL Trace / SQL Profiler. Para ampliar un poco esa respuesta, SP:StmtCompletedle mostraremos cada declaración dentro de un procedimiento almacenado que se está completando, como parece.

Además, si está en un sistema ocupado e intenta diagnosticar un problema de rendimiento, debe tener cuidado con el Analizador de SQL. SQL Profiler es mucho más lento que el seguimiento a un archivo o el uso de eventos extendidos. Esta publicación de blog de Jonathan Kehayias muestra aproximadamente un 90% de sobrecarga en el rendimiento de un sistema al usar SQL Profiler y aproximadamente un 10% de sobrecarga desde el rastreo hasta el archivo. Menos para eventos extendidos. Es por eso que generalmente se recomienda no ejecutar SQL Profiler por sí mismo mientras

Si bien esta información está disponible a través de Extended Events, sugeriría seguir usando SQL Trace (la tecnología detrás de SQL Profiler) pero en su lugar seguir un archivo(si desea invertir en el aprendizaje y el uso de eventos extendidos, este sería el camino a seguir, en una versión futura de SQL Server, SQL Trace desaparecerá y todo lo que tendremos será eventos extendidos). También le sugiero que filtre a través del botón Filtros de columna la mayor cantidad de ruido de fondo posible para asegurarse de que solo está capturando lo que es necesario. Puede configurar su seguimiento con la herramienta Profiler utilizando los pasos que Kevin describe en su buena respuesta y luego agregar un filtro desde esa misma GUI. Luego, puede exportar el rastreo como un script y ejecutar ese script en el rastreo de SQL Server a un archivo en una carpeta que no contenga archivos de registro de transacciones o bases de datos. Para exportar, simplemente debe configurar su rastreo, ejecutarlo durante unos segundos para asegurarse de que está capturando lo que desea, detenerlo y luego ir a la barra de menú y File->Export-> Script Trace Definitiony guarda el archivo. Luego abra ese archivo en una nueva ventana de consulta en el servidor que desea rastrear. Puede ver más sobre las opciones y definiciones de esta secuencia de comandos que creó al consultar los artículos de ayuda para los diversos procedimientos almacenados utilizados en esa secuencia de comandos que acaba de crear al comenzar aquí .

Si tiene tiempo y desea aprender, también puede leer algunos artículos sobre eventos extendidos y ver cómo capturar la información también. Jonathan Kehayias es un gran recurso para publicaciones de blog cuando esté listo para comenzar allí.

Mike Walsh
fuente
2
¿Qué pasa cuando un SP: StmtCompleted solo muestra "- Texto cifrado" en el texto de la consulta? ¿Cómo podemos saber a qué tablas se accede?
Brain2000
Tener el mismo problema que tú @ Brain2000 ...
wenzzzel
21

Puede capturar las declaraciones individuales en un procedimiento almacenado a través de SQL Server Profiler. Para hacer esto, en la pestaña Selección de eventos, haga clic en la casilla de verificación "Mostrar todos los eventos". Luego, desplácese hacia abajo hasta la categoría Procedimientos almacenados y marque la casilla junto a SP: StmtCompleted . Si también tiene seleccionados los eventos SQL: BatchStarted y SQL: BatchCompleted , puede obtener una imagen de principio a fin de la ejecución de un procedimiento almacenado, uniéndolo todo por SPID.

También podría ser útil mirar el caché del plan para ver si puede obtener un plan de consulta para su procedimiento de ejecución lenta. Podrías comenzar con algo como esto:

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
Kevin Feasel
fuente