Sortieren von. Überprüfen Sie diese Abfrage aus:
SELECT total_worker_time/execution_count AS AvgCPU
, total_worker_time AS TotalCPU
, total_elapsed_time/execution_count AS AvgDuration
, total_elapsed_time AS TotalDuration
, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads
, (total_logical_reads+total_physical_reads) AS TotalReads
, execution_count
, SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1
, ((CASE qs.statement_end_offset WHEN -1 THEN datalength(st.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS txt
, query_plan
FROM sys.dm_exec_query_stats AS qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st
cross apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY 1 DESC
Dadurch werden Sie die Abfragen in den Plan-Cache in der Reihenfolge, wie viel CPU sie verbraucht haben. Sie können dies wie in einem SQL-Agent-Job in regelmäßigen Abständen ausführen und die Ergebnisse in eine Tabelle einfügen, um sicherzustellen, dass die Daten auch nach Neustarts erhalten bleiben.
Wenn Sie die Ergebnisse lesen, werden Sie wahrscheinlich erkennen, warum wir diese Daten nicht direkt mit einer einzelnen Datenbank korrelieren können. Erstens kann eine einzelne Abfrage auch seine wahren Datenbank Eltern verstecken, indem Tricks wie dies zu tun:
USE msdb
DECLARE @StringToExecute VARCHAR(1000)
SET @StringToExecute = 'SELECT * FROM AdventureWorks.dbo.ErrorLog'
EXEC @StringToExecute
Die Abfrage in MSDB ausgeführt werden würde, aber es wäre Ergebnisse von Adventure abzufragen. Wo sollten wir den CPU-Verbrauch zuweisen?
Es wird noch schlimmer, wenn Sie:
- Join zwischen mehreren Datenbanken
- Führen Sie eine Transaktion in mehreren Datenbanken, und die Verriegelungs Aufwand mehrere Datenbanken
- Run SQL-Agent-Aufträge in MSDB erstreckt sich über die "Arbeit" in MSDB, aber sichern Sie einzelne Datenbanken
Es geht weiter und weiter. Aus diesem Grund ist es sinnvoll, die Leistung auf Abfrageebene statt auf Datenbankebene abzustimmen.
In SQL Server 2008R2 hat Microsoft Performance Management- und App-Management-Funktionen eingeführt, mit denen wir eine einzelne Datenbank in einem distributierbaren und implementierbaren DAC-Paket verpacken können. Diese Funktionen erleichtern die Verwaltung der Leistung einzelner Datenbanken ihre Anwendungen. Es tut aber immer noch nicht, wonach du suchst.
Für mehr von denen, überprüfen Sie die T-SQL repository at Toad World's SQL Server wiki (formerly at SQLServerPedia).
Aktualisiert am 1/29, um die Gesamtzahl statt der Durchschnittswerte anzugeben.
Verzeihen Sie meine Ignoranz, aber was sind die Einheiten von AvgCPU und AvgDuration? – Portman
Millisekunden für beide - Millisekunden der CPU-Zeit und Millisekunden der Dauer. Sie können unterschiedlich sein, da Abfragen auf E/A, Sperren, Clients usw. warten können. Ich modifiziere die Abfrage, um auch die Gesamtsummen zu erfassen. (Ich wollte Fußpfund sagen, aber ich konnte kein wirkliches Gesicht halten.) –