私は、拡張イベントを使用してSQL Serverの監視システムをセットアップし、開発者向けの「運用フィードバック」として重いクエリを見つけています。私は、イベントを使用していますsp_statement_completed
とsql_statement_completed
、CPU_TIME上の述語フィルタを使用して、論理読み取り、など私は上の結果集計するために期待していたdatabase_name
し、query_hash
すべてのインターネット上で多数の例で示されたように、結果に、私はそれが見るquery_hash
すべての文のために0であります以下の表のように、EXECを使用します(読みやすくするためにタイムスタンプとクエリハッシュを短縮)。
name timestamp query_hash plan_handle statement
sql_statement_completed 2016...6414 0 050056019600764... exec Shared.dbo.SyncFirm
sql_statement_completed 2016...9946 0 06003d00e01e730... exec spSetUserAuth @userid;
sql_statement_completed 2016...7184 0 0600e30028c9da0... exec spSetUserAuth @userid;
sp_statement_completed 2016...0409 9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable
sp_statement_completed 2016...1448 8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns) EXEC(@sql)
sql_statement_completed 2016...7752 0 0600f9006c23f03... exec spSetUserAuth @userid;
sql_statement_completed 2016...1443 1304...641 06005a0008a9b11... select SUBQ.ontrackstatus, COUNT(SUBQ.ontrac
すべての結果には価値がplan_handle
あり、それらはすべて異なるため、多くの計画が生成されています。query_hash
(私が見た)を含まない他のステートメントには、ALTER INDEX、CHECKPOINT、UPDATE STATISTICS、COMMIT TRANSACTION、FETCH NEXT FROM Cursor、一部のINSERT、SELECT @ variable、IF(@variable = x)があります。
query_hash
が0である理由を誰かが知っていますか?SQLクエリアナライザーとEXECのどこかにポイントがないと思いますが、正しい方向に向ける手掛かりを見つけることができません。私が持っている結果が「正常」である場合、結果を最もよく集計するにはどうすればよいですか?ステートメントによるグループ化には、query_hashの計算時に削除されるリテラル、空白などが含まれませんか?
編集:私が今見ているようにEXEC SomeStoredProcedure
、ストアドプロシージャ(自明)を開始し、そのストアドプロシージャ内の個々のステートメントはイベントとしてイベントセッションで終了し、sp_statement_completed
それらすべてにquery_hashがあります。
したがってsp_statement_completed
(つまり、「実際の」クエリ)、query_hashとdatabase_nameで集計できますsql_statement_completed
。query_hash(EXEC SomeStoredProcedure)なしでは、を使用しclient_connection_id
て、ストアドプロシージャの特定の実行内のステートメントをグループ化し、最も多いものを確認できます。手順の費用のかかる部分。
query_hash
0ですが、なぜ用としてexec spSetUserAuth @userid;
行は別のプランハンドルを持っている:The algorithms to match new SQL statements to existing, unused execution plans in the cache require that all object references be fully qualified.
(出典。)これらすべてのエントリが例えばだったらexec dbo.spSetUserAuth @userid;
、あなたは彼らのために、同一のプランハンドルを取得する可能性があります。