sql >> データベース >  >> RDS >> Sqlserver

SQL Serverでクエリ実行プランを取得するにはどうすればよいですか?

    実行プランを取得する方法はいくつかありますが、状況に応じてどの方法を使用するかによって異なります。通常、SQL Server Management Studioを使用して計画を取得できますが、何らかの理由でSQL Server Management Studioでクエリを実行できない場合は、SQLServerProfilerまたは検査によって計画を取得できると便利な場合があります。計画キャッシュ。

    方法1-SQLServerManagementStudioを使用する

    SQL Serverには、実行プランのキャプチャを非常に簡単にするいくつかの優れた機能が付属しています。[実際の実行プランを含める]メニュー項目([クエリ]メニューの下にあります)にチェックマークが付いていることを確認し、通常どおりクエリを実行します。 。

    ストアドプロシージャ内のステートメントの実行プランを取得しようとしている場合は、次のようにストアドプロシージャを実行する必要があります。

    exec p_Example 42
    

    クエリが完了すると、「実行プラン」というタイトルの追加のタブが結果ペインに表示されます。多くのステートメントを実行した場合、このタブに多くの計画が表示される場合があります。

    ここから、SQL Server Management Studioで実行プランを確認するか、プランを右クリックして[名前を付けて実行プランを保存...]を選択し、プランをXML形式のファイルに保存します。

    方法2-SHOWPLANオプションの使用

    この方法は方法1と非常によく似ていますが(実際、これはSQL Server Management Studioが内部で行うことです)、完全を期すため、またはSQL ServerManagementStudioを使用できない場合に備えて含めました。

    クエリを実行する前に、1つを実行します 次のステートメントの。ステートメントはバッチ内の唯一のステートメントである必要があります。つまり、同時に別のステートメントを実行することはできません。

    SET SHOWPLAN_TEXT ON
    SET SHOWPLAN_ALL ON
    SET SHOWPLAN_XML ON
    SET STATISTICS PROFILE ON
    SET STATISTICS XML ON -- The is the recommended option to use
    

    これらは接続オプションであるため、接続ごとに1回だけ実行する必要があります。この時点から、実行されるすべてのステートメントには、追加の結果セットが付随します。 実行プランを目的の形式で含める-通常のプランの表示と同じようにクエリを実行するだけです。

    完了したら、次のステートメントでこのオプションをオフにできます。

    SET <<option>> OFF
    

    実行計画形式の比較

    強い好みがない限り、STATISTICS XMLを使用することをお勧めします。 オプション。このオプションは、SQL Server Management Studioの[実際の実行プランを含める]オプションと同等であり、最も便利な形式でほとんどの情報を提供します。

    • SHOWPLAN_TEXT -クエリを実行せずに、基本的なテキストベースの推定実行プランを表示します
    • SHOWPLAN_ALL -クエリを実行せずに、コスト見積もりを含むテキストベースの見積もり実行計画を表示します
    • SHOWPLAN_XML -クエリを実行せずに、コスト見積もりを含むXMLベースの見積もり実行プランを表示します。これは、SQL ServerManagementStudioの[推定実行プランの表示...]オプションに相当します。
    • STATISTICS PROFILE -クエリを実行し、テキストベースの実際の実行プランを表示します。
    • STATISTICS XML -クエリを実行し、XMLベースの実際の実行プランを表示します。これは、SQL ServerManagementStudioの[実際の実行プランを含める]オプションに相当します。

    方法3-SQLServerプロファイラーの使用

    クエリを直接実行できない場合(または、クエリを直接実行してもクエリの実行速度が遅い場合は、クエリのパフォーマンスが低下することを忘れないでください)、SQLServerプロファイラートレースを使用してプランをキャプチャできます。アイデアは、「Showplan」イベントの1つをキャプチャしているトレースが実行されている間にクエリを実行することです。

    負荷に応じてできることに注意してください この方法は実稼働環境で使用しますが、明らかに注意が必要です。 SQL Serverプロファイリングメカニズムは、データベースへの影響を最小限に抑えるように設計されていますが、これはがないことを意味するものではありません。 パフォーマンスへの影響。データベースが頻繁に使用されている場合は、トレース内の正しいプランのフィルタリングと識別に問題が発生する可能性もあります。 DBAに、貴重なデータベースでこれを実行して満足しているかどうかを確認する必要があります。

    1. SQL Server Profilerを開き、トレースを記録する目的のデータベースに接続する新しいトレースを作成します。
    2. [イベントの選択]タブで[すべてのイベントを表示]をオンにし、[パフォーマンス]->[ShowplanXML]行をチェックしてトレースを実行します。
    3. トレースの実行中に、実行速度の遅いクエリを実行するために必要なことは何でも実行します。
    4. クエリが完了するのを待って、トレースを停止します。
    5. トレースを保存するには、SQL Server Profilerでプランxmlを右クリックし、[イベントデータの抽出...]を選択して、プランをXML形式でファイルに保存します。

    取得するプランは、SQL ServerManagementStudioの[実際の実行プランを含める]オプションと同等です。

    方法4-クエリキャッシュの検査

    クエリを直接実行できず、プロファイラートレースもキャプチャできない場合でも、SQLクエリプランキャッシュを調べることで推定プランを取得できます。

    SQL Server DMVにクエリを実行して、プランキャッシュを検査します。以下は、キャッシュされたすべてのクエリプランを(xmlとして)SQLテキストとともに一覧表示する基本的なクエリです。ほとんどのデータベースでは、さらにフィルタリング句を追加して、関心のあるプランだけに結果をフィルタリングする必要があります。

    SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
    FROM sys.dm_exec_cached_plans 
    CROSS APPLY sys.dm_exec_sql_text(plan_handle)
    CROSS APPLY sys.dm_exec_query_plan(plan_handle)
    

    このクエリを実行し、プランXMLをクリックして、新しいウィンドウでプランを開きます。右クリックして[名前を付けて実行プランを保存...]を選択し、プランをXML形式でファイルに保存します。

    注:

    関係する要素は非常に多いため(テーブルとインデックスのスキーマから、保存されているデータやテーブルの統計に至るまで)、常に 関心のあるデータベース(通常はパフォーマンスの問題が発生しているデータベース)から実行プランを取得してみてください。

    暗号化されたストアドプロシージャの実行プランをキャプチャすることはできません。

    「実際の」実行計画と「推定」実行計画

    実際 実行プランは、SQL Serverが実際にクエリを実行するプランですが、推定 実行プランSQLServerは、何を実行するかを決定します。 クエリを実行せずに実行します。論理的には同等ですが、実際の実行プランには、クエリの実行時に実際に何が起こったかに関する追加の詳細と統計が含まれているため、はるかに便利です。これは、SQL Serverの見積もりがずれている問題(統計が古くなっている場合など)を診断する場合に不可欠です。

    • 推定および実際の実行計画の再検討

    クエリ実行プランを解釈するにはどうすればよいですか?

    これは、それ自体が(無料の)本にふさわしいトピックです。

    関連項目:

    • 実行計画の基本
    • SHOWPLANのアクセス許可とTransact-SQLバッチ
    • SQL Server 2008 –クエリハッシュとクエリプランハッシュの使用
    • SQLServerプランキャッシュの分析


    1. PostgreSQLで文字列値(evalなど)内でクエリを実行する方法はありますか?

    2. SQL ServerのIDから列の名前を取得します:COL_NAME()

    3. IDENTITY列を広げることによる影響の最小化–パート4

    4. SQL Serverへの接続の確立中に、ネットワーク関連またはインスタンス固有のエラーが発生したのはなぜですか?