2016-09-29 2 views
1

MAXDOPが実際に行うことについて混乱します。私はそれがMAXDOPで指定されたプロセッサの数で実行するようにSQLクエリを制約することを読んだ。他の記事では、MAXDOPは、クエリ内の演算子が制約されているプロセッサの数を制限していると言います。SQL ServerとMAXDOPの設定の効果

システムが4CPUで、MAXDOPを2に設定した場合、2つのインデックススキャンが並列化される単純なクエリを実行すると、5スレッドで終了することがわかります。

MAXDOP設定のため、これらの5つのスレッドが2つのCPUでのみ実行されるように制限されますか?

答えて

3

MAXDOPヒント制限双方各並列演算子とクエリ・プラン内のすべての並列オペレータによって使用される論理CPUの総数で使用されるスレッドの数。 This postはこれをより詳細に説明しています。

質問に記載されている2つの並列索引スキャンでは、各並列スキャンは2つのスレッドに制限され、合計4つの並列スレッドに制限されています。これらの並列スレッドのタスクは、MAXDOP番号で指定されたものと同じCPUを共有します。同じCPU上で一度に1人以上のワーカーをアクティブにすることはできません。そのため、並列操作のために特定の時間に実際に使用されたCPUの総数はMAXDOPによって制限されます。しかし、MAXDOPの一部とはみなされない他のプラン演算子用のスレッドもあります。そのため、クエリでは最大3つのコアを同時に使用できます。

を実行し、クエリの実行中に、このクエリと、あなたは1個以下の時に与えられたスケジューラ上で実行中のタスクが表示されるはずです。

SELECT ost.session_id 
     , ost.scheduler_id 
     , w.worker_address 
     , ost.task_state 
     , wt.wait_type 
     , wt.wait_duration_ms 
FROM sys.dm_os_tasks ost 
     LEFT JOIN sys.dm_os_workers w ON ost.worker_address = w.worker_address 
     LEFT JOIN sys.dm_os_waiting_tasks wt ON w.task_address = wt.waiting_task_address 
WHERE ost.session_id = 54 
ORDER BY scheduler_id; 
+0

Maxdopsも(SQL Serverのワークグループ版であるSQL Serverのエディションによって制限されています2)あなたが走っていること。変更する必要がある場合を除いて、「0」のままにしておき、割り当てるSQL Serverの数をSQL Serverに決定させます。 –

関連する問題