ストアドプロシージャのプロファイル方法


26

私はSQL Server 2012を使用していますが、ストアドプロシージャをプロファイルする方法を疑問に思っていました

たとえば、プロファイラーは、ストアドプロシージャ内の個々のSQLステートメントをキャプチャできますか?

マージレプリケーションストアドプロシージャを診断しようとしていますが、これはマージエージェントの完全な実行の一部としてキャプチャする必要があります。パフォーマンスの問題が発生したストアドプロシージャを取得して再度実行することは、その時点では遅くないため不可能と思われます。

回答:


27

Kevinの回答では、SQL Trace / SQL Profilerでキャプチャするイベントについて説明しています。その答えを少し広げるとSP:StmtCompleted、ストアドプロシージャ内の各ステートメントが聞こえるように表示されます。

また、忙しいシステムでパフォーマンスの問題を診断しようとしている場合は、SQLプロファイラーに注意する必要があります。SQLプロファイラーは、ファイルへのトレースや拡張イベントの使用よりもはるかに低速です。Jonathan Kehayiasによるこのブログ投稿ではSQL Profilerの使用によるシステムパフォーマンスの90%のオーバーヘッドと、ファイルへのトレースによる約10%のオーバーヘッドが示されています。拡張イベントの場合は少なくなります。そのため、通常はSQLプロファイラー自体を実行しないことをお勧めします。

この情報は拡張イベントを通じて入手できますが、SQLトレース(SQLプロファイラーの背後にある技術)を引き続き使用することをお勧めしますが、代わりにファイルにトレースします(拡張イベントの学習と使用に投資したい場合、これは進むべき道です。SQLServerの将来のバージョンでは、SQLトレースはなくなり、拡張イベントのみとなります)。また、必要なものだけをキャプチャしていることを確認するために、できる限り多くのバックグラウンドノイズを列フィルターボタンでフィルタリングすることをお勧めします。プロファイラーツールを使用して、Kevinが良い答えで説明した手順を使用してトレースをセットアップし、同じGUIからフィルターを追加できます。次に、トレースをスクリプトとしてエクスポートし、そのスクリプトをSQL Serverトレースで、データベースまたはトランザクションログファイルを含まないフォルダー上のファイルに実行できます。エクスポートするには、単にトレースをセットアップし、数秒間実行して必要なものをキャプチャしていることを確認してから停止し、メニューバーに移動してFile->Export-> Script Trace Definitionファイルを保存します。次に、トレースするサーバー上の新しいクエリウィンドウでそのファイルを開きます。ここから開始し作成したスクリプトで使用されているさまざまなストアドプロシージャのヘルプ記事を参照すると、作成したこのスクリプトのオプションと定義の詳細を確認できます

時間があり、学習したい場合は、拡張イベントに関する記事を読んで、情報をキャプチャする方法も参照してください。Jonathan Kehayiasは、ブログを開始する準備が整ったときにブログを投稿するための優れたリソースです。


2
SP:StmtCompletedがクエリテキストに「暗号化されたテキスト」を表示する場合はどうでしょうか。どのテーブルがアクセスされているかをどのようにして見つけることができますか?
Brain2000 14年

あなたと同じ問題を抱えている@ Brain2000 ....
wenzzzel

21

SQL Server Profilerを使用して、ストアドプロシージャの個々のステートメントをキャプチャできます。これを行うには、[イベントの選択]タブで[すべてのイベントを表示]チェックボックスをクリックします。次に、[ストアドプロシージャ]カテゴリまで下にスクロールし、[ SP:StmtCompleted]の横のボックスをオンにします。あなたも持っている場合はBatchStarted:SQLおよびSQL:BatchCompletedの選択したイベントを、あなたは、SPIDにより、すべて一緒にそれを結ぶ、ストアドプロシージャの実行の開始・ツー・エンドの画像を得ることができます。

また、プランキャッシュを調べて、実行速度の遅い手順のクエリプランを取得できるかどうかを確認することも役立ちます。次のようなものから始めることができます。

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.