Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 Utilizzo elevato della CPU

È possibile identificare query costose (e i database a cui sono associate) utilizzando i DMV, ad es. da questo articolo TechNet :

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;

Questi ti parleranno di query pesanti, ma sfortunatamente non individueranno un database che potrebbe avere un volume molto elevato di piccole query che utilizzano piccoli bit di CPU individualmente ma bit grandi in aggregato. Puoi farlo con questa query dalle query DMV di Glenn Allan Berry :

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);

Nessuna di queste query identifica l'applicazione che le ha eseguite e le DMV utilizzate non memorizzano tali informazioni (dovresti cogliere le query sul fatto e annotare il nome dell'applicazione in sys.dm_exec_sessions o rivedere una traccia).

Ovviamente puoi automatizzare questo lavoro con una varietà di strumenti di prestazioni di terze parti sul mercato (disclaimer:lavoro per uno di loro, SQL Sentry, che produce Consulente delle prestazioni , che fa tutto quanto sopra, incluso tenere traccia delle query ad alto costo e mantenere le informazioni su quale database sono stati eseguiti e quale applicazione li ha chiamati).