私は自分のコンピューターでMAXDOP
をテストしたいと思っていました。したがって、特定のクエリに対してMAXDOP
を2に設定します。ただし、クエリを実行しているときにタスクマネージャーで自分の論理プロセッサを確認すると、すべて使用されているように見えました。 MAXDOP
が2に設定されている場合、2つの論理プロセッサしか使用しないと思いましたか?誰かが何が起こっているのか知っていますか?下の画像をご覧ください。
もう1つの問題は、実行プランによって返されたDOP
が1と言ったことです。MAXDOP
を設定しても、SQL Serverが実際に数値セットを使用することを意味するわけではありません。ただし、私の4つの論理プロセッサすべてがクエリの処理に使用されているように見えると、DOP
1を表示するのはさらにおかしくなります。
これは私が実行したクエリです:
これは私が実行したときに発生したことです(つまり、4つの論理プロセッサすべてがクエリの実行に使用されているように見えます)。
クエリは非並列(シリアル)プランであるため、単一のSQLOS スケジューラー に関連付けられた単一のSQL Server ワーカースレッド で最初から最後まで確実に実行されます。
オペレーティングシステムの観点からは、この単一のスレッドは、デフォルトでWindowsの通常のスケジューリングアルゴリズムの影響を受けます。動作は CPUアフィニティマスク の設定に依存するため、「デフォルトで」と言います。
デフォルトでは、マスクはすべてゼロです。つまり、Windowsは、タイムスライスごとにスレッドを実行する物理実行ユニット(コアなど)を選択できます。該当するスケジューラーのCPUアフィニティー・マスクが1に設定されている場合、スケジューラーは常に特定の物理処理装置にバインドされます。
したがって、SQL Serverスレッドが100%で実行されていると、物理ユニットを迂回して、「にじみ」パターンが発生する傾向があります。アフィニティマスクが設定されている場合、Windowsがスレッドを移動することが許可されていないため、アクティビティのスパイクがより明確になります。
そうは言っても、タスクマネージャーに表示されるパターンは、SQL ServerのCPUアクティビティを調べるための優れた方法ではありません。クエリの実行時に実行されるプロセスはSQL Serverだけではありません。たとえば、SSMSが結果を受信して画面に書き込むことによるCPU使用率も確認できます。
SQL Serverは、スケジューラ、ワーカー、スレッドなどを調べるために、さまざまな 動的管理オブジェクト を提供しています。現在のセッション、リクエストなどのステータスを確認するための さらに があります。
これらの概念が初めての場合は、TechNetの記事 SQL Server Batch or Task Scheduling および関連コンテンツを参照してください。
もう1つの問題は、実行プランによって返されるDOPが1と言ったことです
MAXDOP
クエリヒントは、クエリが使用する可能性のあるスケジューラの総数のみを制限します。コンパイル時に、オプティマイザはコストの見積もりに基づいて、シリアルプランとパラレルプランのどちらかを決定できます。問題のような非常に単純なSELECT
クエリの場合、オプティマイザは通常、並列処理を使用しない「簡単な」実行プランを選択します。