SQL Serverスレッドについての私の理解は、SQL Serverがセッション内の実行要求をいくつかのタスクに分解し、各タスクをワーカースレッドに関連付けることです。そのため、SQL Serverは、並列クエリか非並列クエリかに関係なく、常に複数のスレッド(利用可能で必要な場合)を使用してクエリを実行しようとします。
しかし、次のステートメント(Microsoft SQL Server 2012の内部(MS Press)からの本)は、別のことを述べているようです:
並列クエリ実行プランは複数のスレッドを使用できます。非並列クエリで使用されるシリアル実行プランは単一スレッドのみを使用します。
編集:私の当初の理解は(おそらく間違っている)スケジューラが(必要な場合)同じNUMAノードから複数のワーカー/スレッドを使用して、シリアル実行の場合に同じ実行リクエストの異なるタスクを処理する可能性があります.
並列実行の場合、複数のスケジューラー/プロセッサーが同じ実行要求(複数のタスクに分解)を同時に処理し、各スケジューラーは(必要に応じて)複数のワーカー/スレッドを使用します。それぞれのNUMAノード。
つまり、並列かどうかにかかわらず、複数のスレッドが使用される可能性があります。
明らかに、私の元の理解には欠陥があるはずですが、誤解がどこにあるのかはわかりません。 [〜#〜] parallel [〜#〜]クエリが実行されている場合にのみ、私の元の理解は適用されますか?
ありがとう
私の最初の理解は、(おそらく正しくない)スケジューラーが(必要な場合)同じNUMAノードから複数のワーカー/スレッドを使用して、シリアル実行の場合に同じ実行要求の異なるタスクを処理する可能性があることです。
シリアルプランは複数のスレッドを使用せず、単一のスレッドのみを使用してタスクを実行します。 serialクエリが開始すると、それはスケジューラにバインドされ、そのスケジューラはこのクエリを完了するまで他のタスクを実行しません。スケジューラーはプロセスが完了するのを待つため、クエリを強制的に待機させます。
また、MAXDOP設定は並列処理に使用されるスレッドの量を制御します MAXDOPは常に実行プランごとではなく、実行プラン内のオペレーターごとに指定されます
以下のポール・ホワイトの記事を読むことを強くお勧めします