2008-11-03 19 views
62

El monitor de actividad en sql2k8 nos permite ver las consultas más caras. Ok, eso es genial, pero ¿hay alguna manera de que pueda registrar esta información u obtener esta información a través del analizador de consultas? Realmente no quiero tener la consola de administración Sql abierta y yo mirando el panel de control de actividad.¿Cómo puedo iniciar sesión y encontrar las consultas más caras?

Quiero averiguar qué consultas están mal escritos/esquema está mal diseñado, etc.

montones gracias por cualquier ayuda!

Respuesta

60
  1. Uso de SQL Server (en el menú herramientas de SSMS) para crear una traza que registra estos sucesos:

    RPC:Completed 
    SP:Completed 
    SP:StmtCompleted 
    SQL:BatchCompleted 
    SQL:StmtCompleted 
    
  2. Puede comenzar con la plantilla de huella estándar y podarlo. No especificó si esto era para una base de datos específica o el servidor completo, si es para Db específicos, incluye la columna DatabaseID y establece un filtro para su DB (SELECT DB_ID('dbname')). Asegúrese de que la columna de datos de Lectura lógica esté incluida para cada evento. Establezca el seguimiento para iniciar sesión en un archivo. Si deja este rastro para ejecutar desatendido en el fondo, es una buena idea establecer un tamaño máximo de archivo de rastreo, digamos 500 MB o 1 GB si tiene suficiente espacio (todo depende de la actividad que haya en el servidor, por lo que tendrás que chuparlo y verlo).

  3. Inicie brevemente la traza y luego haga una pausa. Vaya a File-> Export-> Script Trace Definition y elija su versión de base de datos, y guárdela en un archivo. Ahora tiene un script sql que crea un seguimiento que tiene mucha menos sobrecarga que ejecutar a través de la GUI del profiler. Cuando ejecuta este script, generará el ID de seguimiento (generalmente @ID=2); nota esto abajo.

  4. Una vez que tenga un archivo de rastreo (.trc) (ya sea la traza completó porque ha alcanzado el tamaño máximo del archivo o se detiene la traza está ejecutando con

    EXEC sp_trace_setstatus @ID, 0
    EXEC sp_trace_setstatus @ID , 2

puede cargar la traza en perfilador, o utilizar ClearTrace (muy práctico) o cargarlo en una mesa de este modo:

SELECT * INTO TraceTable 
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default) 

continuación, puede ejecutar una consulta para agregar los datos como este:

SELECT COUNT(*) AS TotalExecutions, 
    EventClass, CAST(TextData as nvarchar(2000)) 
,SUM(Duration) AS DurationTotal 
,SUM(CPU) AS CPUTotal 
,SUM(Reads) AS ReadsTotal 
,SUM(Writes) AS WritesTotal 
FROM TraceTable 
GROUP BY EventClass, CAST(TextData as nvarchar(2000)) 
ORDER BY ReadsTotal DESC 

Una vez que haya identificado las consultas costosas, se puede generar y examinar los planes de ejecución reales.

+0

aplausos mitch! suena un poco más complejo de lo que pensé que era necesario, pero definitivamente voy a darle una oportunidad :) ¡salud! –

+0

Ha sido rotundo - espero tener la oportunidad hacia fines de nov. Y luego marcaré la pregunta o haré más q. –

2

¿El Analizador de SQL Server haría lo que necesita? Todavía no utilicé 2008, por lo que no sé si la herramienta todavía está allí, pero si es así, creo que puede configurar un seguimiento para registrar consultas que cumplan criterios específicos (como los que ejecutan e impulsan CPU arriba un cierto umbral).

Hemos utilizado esto en nuestro proyecto e hizo un muy buen trabajo ayudándonos a solucionar problemas de ejecución incorrecta (aunque no lo deje a tiempo completo, confíe en los Contadores de rendimiento de Windows para el seguimiento del estado del rendimiento).

+0

hmm .. he utilizado los montones de perfilador, pero eso no resume la información. es una línea por tipo de consulta de cosa. –

4

Nunca antes había oído hablar de esta herramienta, pero Microsoft proporciona un conjunto de informes que hacen un trabajo fantástico al proporcionarle exactamente esto, incluidas las consultas más lentas. Consulte su Performance Dashboard Reports.

No estoy seguro de si son compatibles con SQL 2008, pero vale la pena echarle un vistazo.

2

Hay una nueva herramienta, Performance Studio en SQL Server 2008 que se basa en vistas de gestión dinámica mantenidas automáticamente por el servidor, que ofrece una visión general del rendimiento del servidor. Vale la pena echarle un vistazo.

20

El siguiente script le da el resultado.

SELECT TOP 10 
SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
((CASE qs.statement_end_offset 
WHEN -1 THEN DATALENGTH(qt.TEXT) 
ELSE qs.statement_end_offset 
END - qs.statement_start_offset)/2)+1), 
qs.execution_count, 
qs.total_logical_reads, 
qs.last_logical_reads, 
qs.total_logical_writes, qs.last_logical_writes, 
qs.total_worker_time, 
qs.last_worker_time, 
qs.total_elapsed_time/1000000 total_elapsed_time_in_S, 
qs.last_elapsed_time/1000000 last_elapsed_time_in_S, 
qs.last_execution_time,qp.query_plan 
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp 
ORDER BY qs.total_logical_reads DESC 
+1

Esto es exactamente lo que quería. Es fácil crear un trabajo para guardarlo. Gracias. – Jbecwar

+17

¿Esto se toma desde aquí? => http://blog.sqlauthority.com/2010/05/14/sql-server-find-most-expensive-queries-using-dmv/ Si es así, es un mejor estilo mencionarlo ... – YvesR

Cuestiones relacionadas