sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008 Hög CPU-användning

Du kan identifiera kostsamma frågor (och de databaser de är associerade med) med hjälp av DMV:erna, t.ex. från denna 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;

Dessa kommer att berätta om tunga sökningar, men tyvärr kommer den inte att peka ut en databas som kan ha mycket stora volymer av små frågor som använder små bitar av CPU individuellt men stora bitar sammanlagt. Du kan göra det med den här frågan från Glenn Allan Berrys DMV-frågor :

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

Ingen av dessa frågor identifierar applikationen som körde dem, och de använda DMV:erna lagrar inte den informationen (du skulle behöva fånga frågorna i praktiken och notera applikationens namn i sys.dm_exec_sessions, eller granska ett spår).

Naturligtvis kan du automatisera detta arbete med en mängd olika prestandaverktyg från tredje part på marknaden (disclaimer:Jag arbetar för en av dem, SQL Sentry, som producerar Prestandarådgivare , som gör allt ovanstående, inklusive att hålla reda på högkostnadsfrågor och underhålla informationen om vilken databas de körde i och vilken applikation som kallade dem).



  1. Är det möjligt att få listan med rader grupperade efter ett kolumnnamn i Mysql?

  2. Generera Javascript Array från Mysql select

  3. (engelska) Hur man använder Oracle Database 19c Pre-Built Developer VM

  4. Flera kolumner i MATCH MOT