web-dev-qa-db-ja.com

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

SQL Server 2012を使用していて、ストアドプロシージャのプロファイルを作成する方法を考えていました

たとえば、プロファイラーは、ストアドプロシージャ内の個々のSQLステートメント、その内容、実行にかかる時間などをキャプチャできますか?

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

29
peter

Kevinの回答は、SQLトレース/ SQLプロファイラーでキャプチャするイベントについて説明しています。その答えを少し拡張するには-SP:StmtCompletedは、完了したストアドプロシージャ内の各ステートメントを表示します。

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

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

時間があって学びたい場合は、拡張イベントに関するいくつかの記事を読んだり、情報を取得する方法を確認したりすることもできます。 Jonathan Kehayias は、ブログ投稿を開始する準備ができているブログ記事に最適なリソースです。

27
Mike Walsh

SQL Server Profilerを使用して、ストアドプロシージャの個々のステートメントをキャプチャできます。これを行うには、[イベントの選択]タブで、[すべてのイベントを表示]チェックボックスをクリックします。次に、[ストアドプロシージャ]カテゴリまでスクロールし、[SP:StmtCompleted]の横のボックスをオンにします。 SQL:BatchStartedおよび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';
22
Kevin Feasel