をこの上の任意の助けをいただければ幸いです、例えば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の小さなビットが、総額の大きいビットを使用している小さなクエリの非常に高いボリュームを持っている可能性があるデータベースを特定しません。
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は、その情報を格納しないあなたが行動し、ノートにクエリをキャッチする必要があります:あなたはこのクエリfrom Glenn Allan Berry's DMV queriesでそれを行うことができますsys.dm_exec_sessionsのアプリケーション名、またはトレースを確認してください)。
もちろん、市販のさまざまなサードパーティ製のパフォーマンスツールを使ってこの作業を自動化することができます(免責事項:私はこれらのすべてを実行するPerformance Advisorを生産するSQL Sentryの仕事をしています。高コストのクエリを実行し、実行したデータベースとアプリケーションがどのデータベースを呼び出したかについての情報を保持します)。