您可以識別高成本查詢(和它們所關聯的數據庫) ,例如from this TechNet article:
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的小位,但在總量大位非常高容量的數據庫。你可以做到這一點與此查詢from Glenn Allan Berry's DMV queries:
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);
這些查詢的標識都沒有跑他們的應用程序,動態管理視圖中使用不存儲該信息(你將不得不趕在行爲和注意查詢sys.dm_exec_sessions中的應用程序名稱或查看跟蹤)。
當然你也可以在市場上(免責聲明自動化與各種第三方性能工具這項工作:我爲他們的工作之一,SQL哨兵,誰生產Performance Advisor,其中完成所有上述情況,包括跟蹤高成本的查詢和維護關於他們運行哪個數據庫以及稱爲他們的應用程序的信息)。