Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation élevée du processeur SQL Server 2008

Vous pouvez identifier les requêtes coûteuses (et les bases de données auxquelles elles sont associées) à l'aide des DMV, par ex. extrait de cet article 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;

Celles-ci vous parleront des requêtes lourdes, mais malheureusement, elles n'identifieront pas une base de données qui pourrait avoir un volume très élevé de petites requêtes qui utilisent de petits bits de CPU individuellement mais de gros bits en agrégat. Vous pouvez le faire avec cette requête des requêtes 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);

Aucune de ces requêtes n'identifie l'application qui les a exécutées, et les DMV utilisées ne stockent pas ces informations (vous devriez saisir les requêtes dans l'acte et noter le nom de l'application dans sys.dm_exec_sessions, ou revoir une trace).

Bien sûr, vous pouvez automatiser ce travail avec une variété d'outils de performance tiers sur le marché (avertissement :je travaille pour l'un d'entre eux, SQL Sentry, qui produit Conseiller en performances , qui effectue tout ce qui précède, y compris le suivi des requêtes coûteuses et la conservation des informations sur la base de données dans laquelle elles ont été exécutées et l'application qui les a appelées).