インスタンスがMAXDOP
1に設定されていて、クエリヒントを使用して特定のクエリを並列化できる場合、SQLは並列処理のコストしきい値を使用して、実際に並列化するかどうかを決定しますか?
簡単な答え:はい。
細部
ここではいくつかの別々のことが行われていますが、それらを分離することが重要です。
何が効果的な並列処理の最大の度合い可能なクエリには?
これへの貢献者は(おおまかに重要な順に):
- リソースガバナーの
MAX_DOP
設定
- クエリヒントの
MAXDOP
設定
max degree of parallelism
インスタンス構成オプション
詳細については、サーバーの「並列処理の最大度合い」設定、リソースガバナーのMAX_DOP、クエリヒントMAXDOPで説明されています。SQLServerで使用する必要があるのはどれですか。Jack Li、Microsoft SQL Serverカスタマーサービスおよびサポート担当シニアエスカレーションエンジニア。以下の表は、そのリンクから複製されています。
クエリプランは並列処理を使用しますか?
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はすべての並列プランでシリアルプランをキャッシュします