sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2008 Alto uso de CPU

Puede identificar consultas costosas (y las bases de datos con las que están asociadas) utilizando los DMV, p. de este artículo de 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;

Estos le informarán acerca de las consultas más importantes, pero desafortunadamente no identificará una base de datos que pueda tener un volumen muy alto de consultas pequeñas que usan pequeños bits de CPU individualmente pero grandes bits en conjunto. Puede hacerlo con esta consulta de las consultas del 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);

Ninguna de estas consultas identifica la aplicación que las ejecutó, y los DMV utilizados no almacenan esa información (tendría que detectar las consultas en el acto y anotar el nombre de la aplicación en sys.dm_exec_sessions, o revisar un seguimiento).

Por supuesto, puede automatizar este trabajo con una variedad de herramientas de rendimiento de terceros en el mercado (descargo de responsabilidad:trabajo para uno de ellos, SQL Sentry, que produce Asesor de rendimiento , que hace todo lo anterior, incluido el seguimiento de las consultas de alto costo y el mantenimiento de la información sobre la base de datos en la que se ejecutaron y la aplicación que las llamó).