SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2012 以降で実行プランから並列化されていない理由を確認

leave a comment

最近、実行プランを見ていて気づいたのですが、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

 

実行プランとしては以下のようになり、いくつかの並列操作が行われていることが確認できます。

image

この実行プランの 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)

 

実行プランとしては以下のようになります。

image

XML を確認した場合は以下のようになっています。


 

この中の [NonParallelPlanReason] が並列化で実行されなかった理由となります。

今回は MAXDOP = 1 に設定していますので、MaxDOPSetToOne となっています。

CPU WEIGHT を調整しなかった場合は並列クエリにならないのですが、この場合は以下のように表示されます。

SELECT COUNT(*)
FROM Table_1 T1
INNER JOIN Table_1 T2
ON T1.Col1 = T2.Col1

並列化できる可能性があるが、設定が要因となり並列化されていない場合に情報が出力されるという感じでしょうか。

クエリの実行プランをきちんと読み解けないとな~と思う今日この頃です。

Share

Written by Masayuki.Ozawa

6月 4th, 2014 at 8:30 am

Posted in SQL Server

Tagged with

Leave a Reply