都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

UPDATE STATISTICS の MAXDOP を指定してみる

 今週も怒涛の一週間が過ぎました。12月は毎年出張が多く(忘年会込)、来週は大阪→新潟→徳島の順で出張します。前回、統計更新でどのような処理が走るのか簡単に書いてみました。
ryuchan.hatenablog.com

 記事の中で下記のようなクエリを実行しました。

USE AdventureWorks;  
GO  
UPDATE STATISTICS Production.WorkOrder PK_WorkOrder_WorkOrderID WITH FULLSCAN;  
GO

 UPDATE STATISTICS は OPTION(MAXDOP.. で最大並列数がコントロールができません。サーバの設定が下記の場合、UPDATE STATISTICS を実行すると、裏での処理は MAXDOP 16 で実行されていまいます。
f:id:koogucc11:20161203194504p:plain

SELECT StatMan([SC0]) FROM (SELECT TOP 100 PERCENT [WorkOrderID] AS [SC0] FROM [Production].[WorkOrder] WITH (READUNCOMMITTED)  ORDER BY [SC0] ) AS _MS_UPDSTATS_TBL  OPTION (MAXDOP 16)

 しかし、ちょっとした工夫で MAXDOP をコントロールすることが可能です。新たにデータベースを作成し、下記の通り設定します。
f:id:koogucc11:20161203194737p:plain

 下記のクエリを SQL Server Management Studio で実行します。

USE Sample;  
GO  
UPDATE STATISTICS AdventureWorks.Production.WorkOrder PK_WorkOrder_WorkOrderID WITH FULLSCAN;  
GO

 SQL Server Profiler で参照すると、データベースで指定した MAXDOP の値が有効になります。統計情報更新時に負荷コントロールをするのに有効な方法かと思います。

SELECT StatMan([SC0]) FROM (SELECT TOP 100 PERCENT [WorkOrderID] AS [SC0] FROM [Production].[WorkOrder] WITH (READUNCOMMITTED)  ORDER BY [SC0] ) AS _MS_UPDSTATS_TBL  OPTION (MAXDOP 1)

るるぶ大阪'17 (国内シリーズ)

るるぶ大阪'17 (国内シリーズ)

るるぶ新潟 佐渡'17 (国内シリーズ)

るるぶ新潟 佐渡'17 (国内シリーズ)

るるぶ徳島 鳴門 祖谷渓 (国内シリーズ)

るるぶ徳島 鳴門 祖谷渓 (国内シリーズ)