Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008 Hohe CPU-Auslastung

Sie können kostspielige Abfragen (und die damit verbundenen Datenbanken) mithilfe der DMVs identifizieren, z. aus diesem TechNet-Artikel :

SELECT TOP 50
 [Average CPU used] = total_worker_time / qs.execution_count,
 [Total CPU used] = total_worker_time,
 [Execution count] = qs.execution_count,
 [Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 
         (CASE WHEN qs.statement_end_offset = -1 
            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
          ELSE qs.statement_end_offset END - 
qs.statement_start_offset)/2)
,[Parent Query] = qt.text
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Average CPU used] DESC;

Diese informieren Sie über schwere Abfragen, aber leider wird keine Datenbank identifiziert, die möglicherweise ein sehr hohes Volumen an kleinen Abfragen enthält, die einzeln kleine Teile der CPU, aber insgesamt große Teile verwenden. Sie können das mit dieser Abfrage von Glenn Allan Berrys DMV-Abfragen tun :

WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], 
  SUM(total_worker_time) AS [CPU_Time_Ms]
 FROM sys.dm_exec_query_stats AS qs
 CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
              FROM sys.dm_exec_plan_attributes(qs.plan_handle)
              WHERE attribute = N'dbid') AS F_DB
 GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
       DatabaseName, [CPU_Time_Ms], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) 
       OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

Keine dieser Abfragen identifiziert die Anwendung, die sie ausgeführt hat, und die verwendeten DMVs speichern diese Informationen nicht (Sie müssten die Abfragen auf frischer Tat abfangen und den Anwendungsnamen in sys.dm_exec_sessions notieren oder eine Ablaufverfolgung überprüfen).

Natürlich können Sie diese Arbeit mit einer Vielzahl von Leistungstools von Drittanbietern auf dem Markt automatisieren (Haftungsausschluss:Ich arbeite für eines davon, SQL Sentry, das Leistungsratgeber , die alle oben genannten Aufgaben erledigt, einschließlich der Verfolgung kostspieliger Abfragen und der Pflege der Informationen darüber, in welcher Datenbank sie ausgeführt und von welcher Anwendung sie aufgerufen wurden).