Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2008 Wysokie użycie procesora

Możesz zidentyfikować kosztowne zapytania (i bazy danych, z którymi są powiązane) za pomocą DMV, m.in. z tego artykułu w 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;

Będą one informować o ciężkich zapytaniach typu hitter, ale niestety nie wskażą bazy danych, która może mieć bardzo dużą liczbę małych zapytań, które używają małych bitów procesora pojedynczo, ale dużych bitów łącznie. Możesz to zrobić za pomocą tego zapytania z zapytań DMV Glenna Allana Berry'ego :

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

Żadne z tych zapytań nie identyfikuje aplikacji, która je uruchomiła, a używane DMV nie przechowują tych informacji (musisz przechwycić zapytania w akcie i zanotować nazwę aplikacji w sys.dm_exec_sessions lub przejrzeć ślad).

Oczywiście możesz zautomatyzować tę pracę za pomocą różnych narzędzi wydajnościowych innych firm dostępnych na rynku (zastrzeżenie:pracuję dla jednego z nich, SQL Sentry, który produkuje Doradca ds. wydajności , który wykonuje wszystkie powyższe czynności, w tym śledzi kosztowne zapytania i utrzymuje informacje o tym, w której bazie danych były uruchomione i jaka aplikacja je nazwała).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wykonać procedurę składowaną w programie C#?

  2. Procedura składowana, która eksportuje dane do plików csv eksportuje tylko do jednego pliku

  3. Jak zwrócić wiele zestawów wyników za pomocą SqlCommand?

  4. Czy istnieje sposób na jednoczesne WYBIERANIE i AKTUALIZOWANIE wierszy?

  5. Kopiowanie wyników zapytania programu SQL Server do tabeli programu Access 2010