DMV を使用して、SQL Server 2005 で各セッションまたは開いているすべての接続の CPU 時間を取得する方法はありますか? sys.dm_exec_query_stats、sys.dm_exec_connections、sys.dm_exec_sessions のさまざまな組み合わせを試してみました。これと同じ情報を取得するための他の明らかな方法がありませんか? 私の環境は SQL Server 2005 で、1 つのデータベースが約 40% の CPU を使用する約 100 のデータベース (以下のクエリを使用して検出) を使用しており、何が (接続数、どのクエリなど) が最大 40 を占めているかを把握しようとしています。 %。
このスクリプトは、各データベースの 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
実用的なサンプルを提供していただければ幸いです。
アップデート:
上記のクエリを変更 - これで十分ですか? 誰かに検証してもらいたい...
WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], sql_handle,
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, sql_handle
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
DatabaseName, [CPU_Time_Ms], text, count(1) as Connections,
CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms])
OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
cross apply sys.dm_exec_sql_text(sql_handle) C
join sys.dm_exec_connections CON on CON.most_recent_sql_handle = sql_handle
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
GROUP BY CPU_Time_Ms, DatabaseName, text
ORDER BY row_num
dm_exec_connections の most_recent_handle は、dm_exec_query_text の sql_handle にマップされるはずですか?