SQL PROFILER El SQL profiler sirve para monitorear SQL. Funciona a través de indicadores que se agregan para ser registrados. En este documento se muestra como identificar los procedimientos más frecuentes y los más lentos, para después poderse concentrar en optimizarlos. Además se comentan contadores que pueden ser útiles en otros múltiples contextos. Están disponibles plantillas con los conjuntos de contadores que se nombran. Más adelante se habla de ellas. También es posible cruzar los datos con los logs obtenidos con perfmon. Se incluye una referencia que muestra como hacerlo. RECOMENDACIONES DE USO En esta dirección se encuentra un manual que explica el uso de SQL profiler http://msdn.microsoft.com/en-us/library/ms187929%28v=SQL.90%29.aspx. Es mejor leerlo al final, solamente si es necesario. Se recomienda: Loguear a un archivo y no a una tabla de sql server. Agrega menos overhead y además después se puede importar el log (.trc) formado. Solo capturar los contadores necesarios. Contadores innecesarios degradan el rendimiento y entorpecen la interpretación de los datos. PIQUES Unos piques útiles para tener en cuenta: Usar plantillas. Las que ya vienen por defecto o hechas por uno mismo. Es más fácil de usar, más rápido y reduce las chances de errarle. Incluir las columnas databasename y objectname: sino hay que ir traduciendo los ids. SALVO que se quiera dejar lo más liviano posible. En ese caso después se hace un join o algo con los datos para volverlos legibles. Usar filtros para guardar solamente lo que queremos mirar (por ejemplo solo loguear los sps de una base de datos en particular, hay un ejemplo en obtener los SP más usados). MONITOREAR LOS PROCEDIMIENTOS ALMACENADOS SQL profiler viene con plantillas predefinidas. Las mismas son: OBTENER LOS SP MÁS USADOS Como la mayoría de la actividad de nuestras bases se da por medio de stored procedures, nos es muy útil la primera de estas plantillas para obtener cuales fueron los SP más invocados. Para lograr esto debemos: 1. Iniciar una traza en sql profiler con la plantilla SP_Counts(use the template sp_counts). Y marcar que se guarde en un archivo. Verificar que se incluyan las columnas databaseName y objectName. Además puede ser muy útil agregar un filtro (con column filter abajo a la derecha) que especifique una base de datos (por ejemplo: databasename like ‘el nombre de mi base’). Para ver como se inicia una traza, consultar: http://msdn.microsoft.com/en-US/library/ms175047%28v=SQL.90%29.aspx 2. Luego de finalizada la captura, volcar los resultados a una tabla de sql server de la siguiente manera: SELECT * INTO <nombre_tabla_traza> FROM ::fn_trace_gettable('C:\MyTrace.trc', default) 3. Realizar la siguiente consulta para ver los diez (por ejemplo) SP más invocados de mi tabla de gestión SELECT top (10) DatabaseName,ObjectName, count (*) FROM nombre_tabla_traza WHERE DatabaseName= <tabla gestion> GROUP BY DatabaseName,objectName ORDER BY count(*) DESC OBTENER LOS SP MÁS L ENTOS Para identificar los SP que demoran más, hay que agregar a la captura el evento SP:Completed. Para identificar la duración de las sentencias individuales en cada SP hay que capturar SP:StmtCompleted y dentro de este evento es muy útil la columna text data que incluye el texto de la sentencia ejecutada. Adjunto a este documento se encuentra una plantilla (SPLentos) que incluye ambos contadores. No hay que olvidarse de agregar el filtro por database name como en el punto 1. Para ver como se importa una plantilla: http://msdn.microsoft.com/en-us/library/ms177471%28v=SQL.90%29.aspx OTROS CONTADORES ÚTILES Conocer todos los contadores disponibles puede ser muy tedioso, en seguida están unos contadores que pueden ser muy útiles. También se incluye una plantilla con todos estos contadores. Para usar la plantilla hay que quitar los innecesarios y evaluar si se filtra por databasename como en el ejemplo de obtener los SP más usados. Execution Warnings: Si el servidor está muy ocupado, puede que la query espere por recursos. Este evento informa cuanto demora esta espera, en el caso de ocurrir. Tiene dos posibles valores: o "Query Wait" se puede usar para ver que tan seguido una query tiene que esperar. o "Query Time-Out" se usa para ver con qué frecuencia una query dio time out esperando por algún recurso. Si ocurren muy amenudo, se puede considerar: reducir la carga, mejorar el HW, reescribir los SP o mejorar algún índice. Hash Warning: Este evento se utliza para medir las recursions de hash y los hash bails. Las recursiones de hash se dan cuando la tabla de hash (que se usa por ejemplo para un join) no entra en memoria. Cuando esto sucede, la tabla se parte en varios pedazos que se mapean a través de una función de hash aplicada sobre los resultados de la función de hash anterior. O sea, la tabla se parte usando como clave de hash los resultados de la función de hash anterior. Esto pasa tantas veces como sea necesario (recursivamente) hasta que las tablas entren en la memoria (hash recursión, evento 0) o hasta que se alcance el máximo de recursiones preestablecido (hash bail, evento 1). En este último caso, es aún peor ya que la consulta se termina procesando según un plan alternativo. Si ocurren con frecuencia, la solucion puede incluir: asegurarse que las estadísticas de los índices están actualizadas, reescribir las consultas, experimentar para cambiar el query plan. Missing column statistics: Este evento indica que las estadísticas (sobre las que se basa el query plan) están desactualizadas para esa consulta, por lo que el query optimizer no evalua las opciones correctamente. Esto da lugar a planes de ejecución que no son óptimos. Missing join predicate: avisa que hay un join sin una clausula on (un outer join). Sort warnings: Avisa que la memoria no es suficiente para albergar los datos que fueron ordenados. Scan started: sirve para ver los table e index scan. No es algo malo en sí, pero si hay muchos puede que falte algún índice o que no se esté usando adecuadamente. Por más información ver el documento de execution plan. CORRELACIONAR CON DATOS DE PERFMON Los datos de una traza de sql profiler se pueden correlacionar con los datos capturados mediante perfmon (el monitor de rendimiento de windows) para ver cómo se hace: http://msdn.microsoft.com/en-us/library/ms191152%28v=SQL.90%29.aspx REFERENCIAS How to use sql profiler : http://msdn.microsoft.com/en-us/library/ff650699.aspx#scalenethowto15_topic2 Using the SQL server profiler : http://www.sql-server-performance.com/tips/sql_server_profiler_tips_p1.aspx using sql profiler (de microsoft): http://msdn.microsoft.com/en-us/library/ms187929%28v=SQL.90%29.aspx