sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2008 Høj CPU-brug

Du kan identificere dyre forespørgsler (og de databaser, de er tilknyttet) ved hjælp af DMV'erne, f.eks. fra denne 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;
 

Disse vil fortælle dig om heavy hitter-forespørgsler, men de vil desværre ikke lokalisere en database, der kan have meget store mængder af små forespørgsler, der bruger små stykker CPU individuelt, men store stykker samlet. Du kan gøre det med denne forespørgsel fra Glenn Allan Berrys DMV-forespørgsler :

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 af ​​disse forespørgsler identificerer den applikation, der kørte dem, og de anvendte DMV'er gemmer ikke disse oplysninger (du skal fange forespørgslerne i færd med at notere programmets navn i sys.dm_exec_sessions eller gennemgå et spor).

Selvfølgelig kan du automatisere dette arbejde med en række 3. parts ydeevneværktøjer på markedet (disclaimer:Jeg arbejder for en af ​​dem, SQL Sentry, som producerer Performance Advisor , som gør alt ovenstående, herunder at holde styr på dyre forespørgsler og vedligeholde oplysningerne om, hvilken database de kørte i, og hvilken applikation kaldte dem).



  1. SQL Server returnerer uventet ugenummer

  2. Hvordan bruger man DataContext.ExecuteCommand og får den udførte lagrede proc-returværdi?

  3. Sådan vælger du poster grupperet efter time på dagen, inklusive timer, der ikke har nogen poster

  4. mysql ekstra kolonner med samme navn fra to tabeller