MAXDOP = 1、クエリヒントと並列処理のコストしきい値


11

インスタンスがMAXDOP1に設定されていて、クエリヒントを使用して特定のクエリを並列化できる場合、SQLは並列処理のコストしきい値を使用して、実際に並列化するかどうかを決定しますか?

このリンクはCTFP MAXDOPが1の場合は無視されることを示唆していますが、私はこの特定の情報を掘り下げることができませんでした。これは、クエリのヒントなしでは意味がありませんMAXDOP

これら2つのリクエストの予想される動作を誰かに教えてもらえますか?

例1:

Instance Maxdop: 1 
CTFP: 50 
Query hint: Maxdop=2 
Query cost: 30

例2:

Instance Maxdop: 1
CTFP: 50
Query hint: Maxdop=2
Query cost: 70

回答:


20

インスタンスがMAXDOP1に設定されていて、クエリヒントを使用して特定のクエリを並列化できる場合、SQLは並列処理のコストしきい値を使用して、実際に並列化するかどうかを決定しますか?

簡単な答え:はい

細部

ここではいくつかの別々のことが行われていますが、それらを分離することが重要です。

  1. 何が効果的な並列処理の最大の度合い可能なクエリには?

    これへの貢献者は(おおまかに重要な順に):

    • リソースガバナーのMAX_DOP設定
    • クエリヒントのMAXDOP設定
    • max degree of parallelismインスタンス構成オプション

    詳細については、サーバーの「並列処理の最大度合い」設定、リソースガバナーのMAX_DOP、クエリヒントMAXDOPで説明されています。SQLServerで使用する必要があるのはどれですか。Jack Li、Microsoft SQL Serverカスタマーサービスおよびサポート担当シニアエスカレーションエンジニア。以下の表は、そのリンクから複製されています。

    並列処理テーブル

  2. クエリプランは並列処理を使用しますか?

    SQL Serverクエリオプティマイザーは常にシリアルプランを最初に検索します*。

    次に、

    • さらなる最適化は正当化されます。そして
    • 最適なシリアルプランのコストがcost threshold for parallelism構成値を超えています


    ...オプティマイザは並列プランを見つけようとします。

    次に、

    • 並列プランが見つかりました(つまり、可能です)。そして
    • パラレルプランのコストは、最良のシリアルプランよりも少ない


    ...並行計画が作成されます。

注:cost threshold for parallelismのみ、オプティマイザは並列プランを探すかどうかに影響します。並列プランがキャッシュされると、CTFP設定に関係なく、再利用時に(スレッドが使用可能である限り)並列処理を使用して実行されます。


インスタンスmaxdop 1とクエリヒントmaxdop 2の両方の例で、有効な使用可能なDOPは2です。並列プランが選択されている場合、DOP 2が使用されます。

例1

CTFPが50で、最も安いシリアルプランのコストが30であるとすると、SQL Serverは並列プランを見つけようとしません。シリアル計画が作成されます。

例2

CTFPが50で、最も安いシリアルプランのコストが70であるとする、SQL Serverはパラレルプランを見つけようとします。このプラン(見つかった場合)のコストが70(シリアルプランのコスト)未満の場合、パラレルプランが作成されます。


クエリの最適化の最終結果は、常に単一のキャッシュされたプラン(シリアルまたはパラレル)になります。オプティマイザーは、search0(TP)およびsearch1(QP)フェーズでシリアルプランのみを検出します。

それはできる次いで、(記載されているように)再実行がsearch1要件とは並列プランを生成します。次に、これまでの最良の全体計画コストに基づいて、シリアルとパラレルのどちらかを選択します。最適化がsearch2(完全最適化)に移行する場合、その選択は拘束力があります。最適化の各フェーズでは多くの選択肢が考慮されますが、ステージからの出力は常に、単一または最良の単一または最良の計画です。

私はこれについて神話で書きました:SQL Serverはすべての並列プランでシリアルプランをキャッシュします


2

例1インスタンスのMaxdop:1 CTFP:50クエリヒント:Maxdop = 2クエリコスト:30

MAXDOPクエリヒントは、インスタンス全体の最大並列度設定をオーバーライドしますが、CTPFが50でクエリコストが30であるため、シリアルプランの場合があります。

例2インスタンスのMaxdop:1 CTFP:50クエリヒント:Maxdop = 2クエリコスト:70

ここでも、MAXDOPヒントがあるため、並列処理の最大次数は2と見なされますが、CTFPは50と見なされ、可能であれば、Paulが並列で実行される可能性があるクエリが実行されます。

インスタンスのMAXDOPが1に設定されていて、クエリヒントを使用して特定のクエリを並列化できる場合、SQLは実際に並列化するかどうかを決定するために並列処理のコストしきい値を使用していますか?

MAXDOPヒントは、最大並列度のインスタンス全体の設定をオーバーライドします。

MAXDOPヒントdocs.microsoftからの引用

MAXDOP番号適用対象:SQL Server 2008〜SQL Server 2017。

このオプションを指定するクエリのsp_configureおよびリソースガバナーのmax degree of parallelism構成オプションを上書きします。MAXDOPクエリヒントは、sp_configureで設定された値を超える可能性があります。MAXDOPがリソースガバナーで構成された値を超える場合、データベースエンジンはリソースガバナーのMAXDOP値を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.