Определение того, какая база данных SQL Server загружает процессор - PullRequest
4 голосов
/ 16 июня 2011

Мы работаем с SQL Server 2008 с около 50 базами данных различного размера и рабочей нагрузки. Иногда SQL Server полностью загружает процессор примерно на минуту, после чего он падает до нормальной базовой нагрузки.

Моя проблема в том, что я не могу определить, какая база данных или соединение вызывает его (я уверен, что это один конкретный запрос, в котором отсутствует индекс - или что-то в этом роде). Я нашел T-SQL запросы, которые дают вам замороженное изображение текущих процессов. Есть также представление «недавние дорогие запросы» и, конечно, профилировщик, но трудно сопоставить с «это база данных, которая вызывает его» * ​​1004 * ответ. Еще труднее то, что проблема исчезает еще до того, как я запустил профилировщик или монитор активности, и это происходит только один или два раза в день.

В идеале я хотел бы использовать счетчик производительности, чтобы я мог просто запустить его в течение дня или двух, а затем взглянуть на то, что вызвало всплески. Однако я не могу найти соответствующий счетчик.

Есть предложения?

Ответы [ 4 ]

7 голосов
/ 16 июня 2011

Это поможет, благодаря Гленну Берри, адаптированному от Роберта Перла:

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);
2 голосов
/ 16 июня 2011

Запустите трассировку профилировщика, регистрируя имя базы данных и процессор во время пика, загрузите данные в таблицу, посчитайте и сгруппируйте в db.

select DatabaseName, sum(CPU) from Trace 
group by DatabaseName
1 голос
/ 16 июня 2011

Посмотрите на sys.dm_exec_query_stats. Столбец total_worker_time является мерой ЦП. Возможно, вы сможете выполнить то, что вы пытаетесь сделать, одним взглядом на представление. Тем не менее, вам может потребоваться создать процесс, чтобы сделать «снимки» вида и сравнить последующие снимки. То есть посмотрите на данные в представлении и сравните их с пятью минутами позже и сравните различия. Разница будет в количестве ресурсов, потребляемых между двумя снимками. Удачи!

0 голосов
/ 16 июня 2011

Вы пробовали связать SQL Server Profiler с системным монитором? Когда вы коррелируете данные, вы можете увидеть скачки производительности, связанные с активностью БД. http://www.sqlservernation.com/home/relating-sql-server-profiler-with-performance-monitor.html

...