最近、実行プランを見ていて気づいたのですが、SQL Server 2012 以降では実行プランに [NonParallelPlanReason] という情報が増えていたようです。
詳細については、SQL Server 2012 Execution Plan’s NonParallelPlanReason が参考になります。
10 万件程度格納されているテーブルを作成して、以下のクエリを実行してみます。
# CPU WEIGHT を調整して並列クエリになりやすいようにしています。
DBCC SETCPUWEIGHT(1000) GO SELECT COUNT(*) FROM Table_1 T1 INNER JOIN Table_1 T2 ON T1.Col1 = T2.Col1
実行プランとしては以下のようになり、いくつかの並列操作が行われていることが確認できます。
この実行プランの XML の情報を表示してみると以下のような内容が出力されています。
今回の環境は 8 コア環境で、MAXDOP=0 に設定していますので、最大で 8 スレッドが使用できることになります。
それでは、MAXDOP を 1 にしてクエリを実行してみます。
DBCC SETCPUWEIGHT(1000) GO SELECT COUNT(*) FROM Table_1 T1 INNER JOIN Table_1 T2 ON T1.Col1 = T2.Col1 OPTION (MAXDOP 1)
XML を確認した場合は以下のようになっています。
この中の [NonParallelPlanReason] が並列化で実行されなかった理由となります。
今回は MAXDOP = 1 に設定していますので、MaxDOPSetToOne となっています。
CPU WEIGHT を調整しなかった場合は並列クエリにならないのですが、この場合は以下のように表示されます。
SELECT COUNT(*) FROM Table_1 T1 INNER JOIN Table_1 T2 ON T1.Col1 = T2.Col1
並列化できる可能性があるが、設定が要因となり並列化されていない場合に情報が出力されるという感じでしょうか。
クエリの実行プランをきちんと読み解けないとな~と思う今日この頃です。