Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Alto uso de CPU do SQL Server 2008


Você pode identificar consultas caras (e os bancos de dados aos quais elas estão associadas) usando os DMVs, por exemplo, deste artigo do 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;

Eles informarão sobre consultas pesadas, mas infelizmente não identificarão um banco de dados que possa ter um volume muito alto de pequenas consultas que estejam usando pequenos bits de CPU individualmente, mas grandes bits agregados. Você pode fazer isso com esta consulta das consultas DMV de 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);

Nenhuma dessas consultas identifica o aplicativo que as executou e os DMVs usados ​​não armazenam essas informações (você teria que capturar as consultas no ato e anotar o nome do aplicativo em sys.dm_exec_sessions ou revisar um rastreamento).

Claro que você pode automatizar esse trabalho com uma variedade de ferramentas de desempenho de terceiros no mercado (disclaimer:eu trabalho para um deles, SQL Sentry, que produz Consultor de desempenho , que faz todos os itens acima, incluindo acompanhar consultas de alto custo e manter as informações sobre em qual banco de dados elas foram executadas e qual aplicativo as chamou).