並列処理度数 (DOP) のフィードバック

適用対象: SQL Server 2022 (16.x)

SQL Server 2022 (16.x) は、経過時間と待機時間に基づいて、反復するクエリの非効率な並列処理を特定することでクエリのパフォーマンスを向上させる、並列処理の次数 (DOP) フィードバックという新機能を導入しました。 DOP フィードバックは、インテリジェント クエリ処理ファミリ機能の一部であり、反復するクエリに対する並列処理の最適化されていない使用に対応するものです。 このシナリオは、過剰な並列処理がパフォーマンスの問題を引き起こす可能性のある場合に、ワークロードのリソース使用量の最適化とスケーラビリティの向上に役立ちます。

DOP フィードバックを使うと、すべてを網羅する各クエリの既定や手動のチューニングに悩まされることなく、DOP を自動チューニングし、これらの問題を回避できます。

その他のクエリ フィードバック機能については、「メモリ許可フィードバック」と「カーディナリティ推定 (CE) のフィードバック」を参照してください。

並列処理の次数 (DOP) フィードバックによる過剰な並列処理の回避

DOP フィードバックを使うと、すべてを網羅する各クエリの既定や手動のチューニングに悩まされることなく、DOP を自動チューニングし、過剰な並列処理を回避できます。 並列処理の利用が非効率であると思われる場合、構成された DOP の出所が何であれ、DOP フィードバックによってクエリの次回の実行で DOP が下がり、それが役立つか検証されます。

多くの場合、並列処理は、レポートや分析のクエリ、または大量のデータを処理するクエリに役立ちます。 逆に、並列で実行される OLTP 中心のクエリでは、すべてのスレッドの調整にかかる時間が、並列プランを使う場合の利点を上回る場合、パフォーマンスの問題が発生する可能性があります。 詳細については、並列プランの実行に関する記事を参照してください。

  • DOP フィードバックを有効にするには、データベースで DOP_FEEDBACKデータベース スコープ構成 を有効にします。

  • データベース レベルで DOP フィードバックを無効にするには、DOP_FEEDBACK データベース スコープ構成を使用します。 たとえば、ユーザー データベースで次のコマンドを実行します。

    ALTER DATABASE SCOPED CONFIGURATION SET DOP_FEEDBACK = OFF;
    
  • クエリ レベルで DOP フィードバックを無効にするには、DISABLE_DOP_FEEDBACK クエリ ヒントを使用します。

DOP フィードバックを使うすべてのデータベースでクエリ ストアを有効にし、"読み取り書き込み" 状態にしておく必要があります。 安定した並列処理の次数フィードバック値に達すると、フィードバックは sys.query_store_plan_feedback カタログ ビューに保持されます。

DOP フィードバックは、データベース互換性レベル 160 (SQL Server 2022 (16.x) で導入) 以上で動作するクエリで使用できます。

検証済みのフィードバックのみが保持されます。 調整された DOP の結果、パフォーマンスが低下した場合、DOP フィードバックは最後に確認された良好な DOP に戻されます。 このコンテキストでは、ユーザーが取り消したクエリも回帰として認識されます。 DOP フィードバックを実行しても、プランは再コンパイルされません。

安定したフィードバックは、プランの再コンパイル時に再確認され、上または下に再チューニングされることがありますが、MAXDOP 設定 (MAXDOP ヒントを含む) を超えることはありません。

SQL Server 2022 (16.x) 以降では、セカンダリ レプリカのクエリ ストアが有効になっている場合、DOP フィードバックは可用性グループ内のセカンダリ レプリカに対してもレプリカ対応になります。 DOP フィードバックは、プライマリ レプリカとセカンダリ レプリカで異なる方法でフィードバックを適用できます。 ただし、DOP フィードバックはセカンダリ レプリカでは保持されず、フェールオーバー時には、古いプライマリ レプリカからの DOP フィードバックは新しいプライマリ レプリカには適用されません。 フェールオーバー時に、プライマリ レプリカまたはセカンダリ レプリカに適用されたフィードバックは失われます。 詳細については、「セカンダリ レプリカ のクエリ ストア」を参照してください。

並列処理の次数 (DOP) のフィードバックの実装

並列処理の次数 (DOP) フィードバックにより、経過時間と待機時間に基づいて、反復するクエリの非効率な並列処理を特定します。 並列処理の利用が非効率であると思われる場合、構成された DOP の出所が何であれ、DOP フィードバックによってクエリの次回の実行で DOP が下がり、それが役立つか検証されます。

クエリの適格性を評価するために、調整されたクエリ経過時間は、数回の実行に対して測定されます。 各クエリの合計経過時間は、並列クエリ実行の外部にあるバッファー ラッチ、バッファー IO、ネットワーク IO の待機時間を無視して調整されます。 DOP フィードバック機能の目標は、クエリ経過時間が多少増えても、全体のコンカレンシーを高め、待機時間を大幅に削減することです。

検証済みのフィードバックのみが保持されます。 調整された DOP の結果、パフォーマンスが低下した場合、DOP フィードバックは最後に確認された良好な DOP に戻されます。 このコンテキストでは、ユーザーが取り消したクエリも回帰として認識されます。

Note

DOP フィードバックを実行しても、プランは再コンパイルされません。

並列処理の次数 (DOP) フィードバックに関する考慮事項

DOP フィードバックでチューニングされるクエリの最小 DOP は 2 です。 連続実行は DOP フィードバックの範囲に含まれません。

フィードバック情報は、 sys.query_store_plan_feedback カタログ ビューを使用して追跡できます。

クエリ ストアを通じて強制されたクエリ プランがクエリに含まれている場合でも、そのクエリに DOP フィードバックを使用できます。

現在、DOP フィードバックはクエリ ヒントと互換性がありません。 詳細については、「ヒント (Transact-SQL) - Query」と「クエリ ストア ヒント」を参照してください。

並列処理の次数 (DOP) フィードバックの拡張イベント

並列処理の次数 (DOP) フィードバックでは、次の XE を利用できます。

  • dop_feedback_eligible_query: クエリ プランが DOP フィードバックの対象となる場合に発生します。 再コンパイルまたは SQL Server インスタンスの再起動が発生した場合、追加のイベントが発生することがあります。
  • dop_feedback_provided: DOP フィードバックにより、特定のクエリのデータが提供されたときに発生します。 このイベントには、初めてフィードバックが提供されたときのベースライン統計情報と、それ以降のフィードバックが提供されたときの以前のフィードバック統計情報が含まれます。
  • dop_feedback_validation: 基準値または以前のフィードバックの統計情報に対に対してクエリ ランタイム統計情報の検証が行われたときに発生します。
  • dop_feedback_stabilized: クエリに対する DOP フィードバックが安定したときに発生します。
  • dop_feedback_reverted: DOP フィードバックが元に戻されたときに発生します。 このイベントは、最初に提供されたフィードバックでフィードバックの検証が失敗したときに発生します。 システムによって、フィードバックなしの状態に戻されます。
  • dop_feedback_analysis_stopped: あるクエリに対する DOP フィードバック分析が停止したときに発生します。

並列処理の次数 (DOP) フィードバックの永続化

適用対象: SQL Server (SQL Server 2022 (16.x) 以降)

DOP フィードバック メカニズムによって、新しい並列処理の次数が適切であることが判明した場合、この最適化はクエリ ストア内に保持され、今後クエリを実行する際に適切に適用されます。

SQL Server 2022 (16.x) で導入されたこの機能は、データベース互換レベル 160 以降、または QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n ヒント 160 以上で動作するクエリを対象として、クエリ ストアがデータベースに対して有効になっており、"読み取り書き込み" 状態である場合に使用できます。