SQL Server 2008以降ではUPDATE STATISTICS WITH FULLSCAN
、シングルスレッド操作ですか、それとも並列処理を使用できますか?デフォルトのサンプリングによる統計の更新はどうですか?並列処理を使用できますか?MAXDOP
update statsで指定するオプションが表示されません。
SQL Server 2008以降ではUPDATE STATISTICS WITH FULLSCAN
、シングルスレッド操作ですか、それとも並列処理を使用できますか?デフォルトのサンプリングによる統計の更新はどうですか?並列処理を使用できますか?MAXDOP
update statsで指定するオプションが表示されません。
回答:
並列統計の更新は、SQL Server 2005以降で利用可能です。これは、TechNetの記事「Microsoft SQL Server 2005のクエリオプティマイザーで使用される統計」に記載されています。
(明示的に要求されたかどうかにかかわらず)フルスキャンが実行される場合、データ収集用に生成された内部クエリの一般的な形式は次のとおりです。
SELECT
StatMan([SC0])
FROM
(
SELECT TOP 100 PERCENT
[Column] AS [SC0]
FROM [Table] WITH (READUNCOMMITTED)
ORDER BY [SC0]
) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 16)
MAXDOP
ヒントに注意してください(ただし、ユーザーがヒントを手動で指定する方法はありません)。サンプリングされた統計が収集される場合、内部クエリはTABLESAMPLE
句を使用して、並列処理を防ぎます。エンジンMAXDOP 1
は、内部クエリに関するヒントも生成しますが、これは少し冗長です。
並列処理を減らす必要がある場合、リソースガバナー(エンタープライズのみ)MAXDOP
を使用して、内部クエリのヒントを上書きできます。
SQL Server 2016 SP2以降では、MAXDOP
オプションを使用できます。
更新により、CREATE STATISTICSおよびUPDATE STATISTICSステートメントのMAXDOPオプションのサポートが追加されます。
この更新プログラムは、Microsoft SQL Server 2016および2017のCREATE STATISTICSおよびUPDATE STATISTICSステートメントのMAXDOPオプションのサポートを追加します。これにより、データベースまたはサーバーレベルで指定された最大並列度(MAXDOP)のデフォルト設定をオーバーライドできます。
注:リソースガバナーが使用されている場合、結果の並列度はワークロードグループのMAX_DOP設定によって制限されます。
たとえば、Sales.SalesOrderDetailテーブルが使用され、いくつかの統計が既に作成されているとします。この場合、次のスクリプトは、8に等しい並列度で各統計を更新します。
UPDATE STATISTICS Sales.SalesOrderDetail WITH MAXDOP = 8
UPDATE STATISTICSには、内部並列処理はありません。FULLSCANまたはSAMPLINGのどちらで実行しているかは関係ありません。もちろん、複数のSQL Agentジョブまたはその他の工夫により、それぞれ異なる接続で複数のUPDATE STATISTICSコマンドを一度に実行できます。ハードウェアとデータの正確な状況によっては、FULLSCANを使用してUPDATE STATISTICSを実行するよりも、テーブルのインデックスを再作成するだけで高速になる場合があります。