Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server 2008 Високо натоварване на процесора

Можете да идентифицирате скъпоструващи заявки (и базите данни, с които са свързани) с помощта на DMV, напр. от тази статия в 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;

Те ще ви разкажат за тежки заявки, но за съжаление няма да посочат база данни, която може да има много голям обем от малки заявки, които използват малки битове CPU поотделно, но големи битове в съвкупност. Можете да направите това с тази заявка от DMV заявките на 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);

Нито една от тези заявки не идентифицира приложението, което ги е изпълнило, а използваните DMV не съхраняват тази информация (ще трябва да уловите заявките в действие и да отбележите името на приложението в sys.dm_exec_sessions или да прегледате следа).

Разбира се, можете да автоматизирате тази работа с различни инструменти за ефективност на трети страни на пазара (отказ от отговорност:работя за един от тях, SQL Sentry, който произвежда Съветник за производителност , който прави всичко по-горе, включително следене на скъпи заявки и поддържане на информация за това в коя база данни са се изпълнявали и кое приложение ги е извикало).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кога е по-добре да пишете ad hoc sql срещу съхранени процедури

  2. Не може да предаде входни параметри към съхранена процедура

  3. Дефинирана от потребителя таблица в паметта, не е в паметта?

  4. Какво представлява предаването на параметри към SQL и защо ми е необходимо?

  5. Тъй като няма параметър за масив на Sqlserver, какъв е най-добрият начин да продължите?