小物SEのメモ帳

IT関係の試したことや調べたことの備忘録

【SQL Server】並列処理MaxDOPの設定確認と変更

SQL Serverでの並列クエリ処理

複数のCPUでクエリを処理して並列処理される場合、実行時間を短縮することができます。
並列クエリの実行では、取得するデータセットを小さく分割して、分割されたデータセットをそれぞれのワーカー・スレッドが並列処理することでクエリ実行の実行時間を短縮することができます。

並列クエリとなる基準は以下の通りです。
1.-数のCPUが搭載されている環境か
2.十分な数のスレッドが使用できるか
3.並列プランを使用するに適しているクエリ、もしくはインデックスか
4.処理行が十分に多いか
5.分布統計が使用できるか

MSに詳しい説明があります。
並列処理の次数

設定値の確認と変更

インスタンス全体にかかる設定としてsp_configure max degree of parallelismオプションを使用して設定するか、特定のクエリの並列を最大並列度(MAXDOP)で指定することができます。
尚、デフォルトは0で、この場合論理プロセッサに対し最大限に使用することがある状態となります。

インスタンス全体にかかる設定の確認をクエリにて行う場合は次のように確認できます。

-- 拡張オプションを表示できるよう設定を変更
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO

-- 拡張オプションを表示
EXEC sp_configure 
GO

f:id:utiowa:20170505170021p:plain

または、プロパティからも確認することができます。
左ペインのオブジェクトエクスプローラからサーバを右クリックし、「プロパティ」を選択。
f:id:utiowa:20170505165940p:plain

「ページの選択」で「詳細設定」を選択して、「並列処理」項目の「並列処理の最大限度」を確認。
f:id:utiowa:20170505170000p:plain


設定を変更する場合、次のように変更できます。

-- 並列度を1にする場合
EXEC sp_configure 'max degree of parallelism', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO


特定のクエリに対するMAXDOPを変える場合は、オプション句でMAXDOPを以下のように指定して実行します。
この場合、上記のsp_configureの設定値を超えた並列度を設定することができます。

SELECT TOP 50000 
   [col1]
    , [col2]
    , [col3]
  FROM [Param_testDB].[dbo].[Parallel_test]
  ORDER BY NEWID()
  OPTION (MAXDOP 2)


並列実行時は実行時間が早くなる分、CPUやメモリへの影響もありますので注意が必要ですが、MSとしてのMaxDOPは推奨値が8以下となっているようです。以下は参考になるかと思いますので、目を通しておくとよいでしょう。
[SQL Server2005以降の推奨値]
https://support.microsoft.com/ja-jp/help/2806535/recommendations-and-guidelines-for-the-max-degree-of-parallelism-configuration-option-in-sql-server


[その他参考]
64 個を超える CPU を搭載したコンピューター上で SQL Server を実行する場合のベスト プラクティス
最適なパフォーマンスを実現するための max degree of parallelism オプションの設定