sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 Hoog CPU-gebruik

U kunt kostbare zoekopdrachten (en de databases waaraan ze zijn gekoppeld) identificeren met behulp van de DMV's, b.v. uit dit 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;

Deze zullen u vertellen over zware zoekopdrachten, maar helaas zal het geen database lokaliseren die een zeer hoog volume aan kleine zoekopdrachten kan hebben die kleine stukjes CPU afzonderlijk gebruiken, maar grote bits in totaal. U kunt dat doen met deze query van de DMV-query's van 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);

Geen van deze query's identificeert de toepassing die ze heeft uitgevoerd, en de gebruikte DMV's slaan die informatie niet op (u zou de query's op heterdaad moeten betrappen en de naam van de toepassing noteren in sys.dm_exec_sessions, of een tracering bekijken).

Natuurlijk kunt u dit werk automatiseren met een verscheidenheid aan prestatietools van derden op de markt (disclaimer:ik werk voor een van hen, SQL Sentry, die Performance Advisor , die al het bovenstaande doet, inclusief het bijhouden van dure zoekopdrachten en het bijhouden van de informatie over in welke database ze zijn uitgevoerd en welke applicatie ze heeft genoemd).



  1. Oracle - update dezelfde tabel waarop de trigger is geactiveerd

  2. VARCHAR-tijdstempel naar TIMESTAMP converteren?

  3. SQL-prestaties zoeken naar lange tekenreeksen

  4. MySQL GROUP BY werkt niet bij migratie naar SQL Server 2012