並列処理の次数

SQL Server は、並列クエリの実行またはインデックス DDL (データ定義言語) 操作のインスタンスごとに、並列処理の最適な次数を自動的に検出します。この処理は次の基準に基づいて実行されます。

  1. SMP (対称型マルチプロセッシング) コンピューターなど、複数のマイクロプロセッサまたは CPU を搭載したコンピューターで SQL Server が実行されているかどうか。

    並列クエリを使用できるのは、複数の CPU を搭載したコンピューターだけです。

  2. 十分な数のスレッドを使用できるかどうか。

    各クエリまたはインデックス操作では、一定数のスレッドを実行する必要があります。並列プランの実行には直列プランの場合よりも多くのスレッドが必要になり、必要なスレッド数は並列処理の次数が高くなるほど増加します。並列処理の特定の次数に応じた並列プランのスレッド要件を満たすことができない場合、データベース エンジンが並列処理の次数を自動的に下げるか、指定されたワークロード コンテキストでの並列プランを完全に破棄します。その後、直列プラン (1 つのスレッド) を実行します。

  3. 実行するクエリまたはインデックス操作の種類。

    インデックスの作成や再構築またはクラスター化インデックスの削除を行うインデックス操作、および CPU サイクルを大量に使用するクエリは並列プランの候補として最適です。たとえば、大きなテーブルの結合、大量の集計、および大きな結果セットの並べ替えは候補として適しています。トランザクション処理アプリケーションに多い単純なクエリの場合、クエリを並列実行するにはさらに調整が必要なので、パフォーマンスの向上は困難です。並列処理の利点を得られるクエリとそうでないクエリを区別するために、データベース エンジンは cost threshold for parallelism 値を使用して、クエリまたはインデックス操作を実行するための推定コストを比較します。ユーザーは sp_configure を使用して既定値の 5 を変更できますが、既定値はできるだけ変更しないでください。

  4. 処理する十分な数の行があるかどうか。

    クエリ オプティマイザーによって行数が少なすぎると判断されると、行を分散するための交換操作は導入されません。したがって、操作は直列に実行されます。直列プランで操作を実行すると、並列操作を実行したときに得られる効果より、起動、分散、および調整のコストの方が上回る事態を回避することができます。

  5. 現在の分布統計が使用できるかどうか。

    並列処理の最高次数が提供されない場合、並列プランが放棄される前に、それより低い次数が検討されます。

    たとえば、ビューにクラスター化インデックスを作成する場合、クラスター化インデックスはまだ存在しないので、分布統計を評価できません。この場合、データベース エンジンでは、インデックス操作用に並列処理の最高次数を提供できません。ただし、並べ替えやスキャンなどの一部の操作では、それまでどおり並列実行の利点を得ることができます。

注意注意

並列インデックス操作は、SQL Server Enterprise Edition、Developer Edition、および Evaluation Edition でのみ使用できます。

既に説明したような現在のシステムのワークロードと構成情報で並列実行が可能かどうかは、実行時にデータベース エンジンによって判断されます。並列実行の条件を満たしている場合、データベース エンジンにより、最適なスレッド数が判断され、これらのスレッド全体に並列プランの実行が分散されます。複数のスレッドでクエリまたはインデックス操作が並列実行で開始された後は、操作で使用されるスレッド数は操作の完了時まで変化しません。データベース エンジンは、プロシージャ キャッシュから実行プランを取得するたびに、最適なスレッド数を再調査して決定します。たとえば、1 回のクエリの実行では直列プランを使用し、同じクエリを再度実行するときは 3 つのスレッドを使用する並列プランを使用し、3 回目に実行するときは 4 つのスレッドを使用する並列プランを使用する場合があります。

並列クエリの実行プランでは、挿入操作、更新操作、および削除操作が直列に実行されます。ただし、UPDATE ステートメントや DELETE ステートメントの WHERE 句、または INSERT ステートメントの SELECT 部分は並列に実行できます。実際のデータ変更は、データベースに直列に適用されます。

静的カーソルとキーセット ドリブン カーソルは、並列実行プランによって作成できます。ただし、動的カーソルの動作は、直列実行の場合だけ有効です。クエリ オプティマイザーは、動的カーソルの一部であるクエリに対しては必ず直列実行プランを生成します。

並列処理の次数の上書き

max degree of parallelism サーバー構成オプションは、並列プランの実行で使用するプロセッサの数を制限する場合に使用します。max degree of parallelism オプションは、MAXDOP クエリ ヒントまたは MAXDOP インデックス オプションを指定することにより、個別のクエリやインデックス操作のステートメントで上書きできます。MAXDOP では、個別のクエリやインデックス操作をより制御できます。たとえば、MAXDOP オプションを使用すると、オンライン インデックス操作専用のプロセッサの数を増減することによって制御できます。このようにして、インデックス操作で使用されるリソースと同時実行ユーザーが使用するリソースのバランスをとることができます。