並べ替えこのクエリを確認してください:
SELECT total_worker_time/execution_count AS AvgCPU
, total_worker_time AS TotalCPU
, total_elapsed_time/execution_count AS AvgDuration
, total_elapsed_time AS TotalDuration
, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads
, (total_logical_reads+total_physical_reads) AS TotalReads
, execution_count
, SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1
, ((CASE qs.statement_end_offset WHEN -1 THEN datalength(st.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS txt
, query_plan
FROM sys.dm_exec_query_stats AS qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st
cross apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY 1 DESC
これは、あなたが使用したCPUの量の順番でプランキャッシュのクエリを取得します。 SQLエージェントジョブの場合と同様に、これを定期的に実行し、テーブルに結果を挿入して、データが再起動を超えて持続することを確認することができます。
結果を読むと、そのデータを個々のデータベースに直接関連付けることができない理由がわかります。まず、単一のクエリにも、このようなトリックを行うことによって、その真のデータベースの親を非表示にすることができます:
USE msdb
DECLARE @StringToExecute VARCHAR(1000)
SET @StringToExecute = 'SELECT * FROM AdventureWorks.dbo.ErrorLog'
EXEC @StringToExecute
クエリがMSDBで実行されるだろうが、それはAdventureWorksの結果をポーリングします。どこでCPU消費量を割り当てるべきですか?
ますときには、悪化する:
- が実行
-
複数のデータベース間で複数のデータベース内のトランザクションに参加し、ロック努力が複数のデータベースMSDBで
- 実行SQLエージェントジョブ「仕事」のことをまたがりますMSDBでは、しかし、個々のデータベースをバックアップします。
それは繰り返します。そのため、データベースレベルではなくクエリレベルでのパフォーマンスの調整が理にかなっています。
マイクロソフトでは、パフォーマンス管理とアプリケーション管理機能を導入して、1つのデータベースを配布可能で展開可能なDACパックにパッケージ化することができました。また、個々のデータベースのパフォーマンス管理を容易にする有望な機能ですそれらのアプリケーション。しかし、あなたが探しているものはまだやっていません。
さらに詳しくは、T-SQL repository at Toad World's SQL Server wiki (formerly at SQLServerPedia)をご覧ください。
1/29に更新され、平均値ではなく合計数値が追加されました。
私の無知ですが、AvgCPUとAvgDurationの単位は何ですか? – Portman
CPU時間とミリ秒の両方のミリ秒単位のミリ秒。 IO、ロック、クライアントなどでクエリを待つことができるため、これらは異なる可能性があります。私は合計を取得するようにクエリを変更します。 (私はフットポンドを言うつもりでしたが、私は仮想の真っ直ぐな顔を保つことができませんでした。) –