UPDATE STATISTICS (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric Warehouse
Microsoft Fabric SQL Database
テーブルまたはインデックス付きビューで、クエリ最適化に関する統計を更新します。 統計は既定で、クエリ プランを改善するためにクエリ オプティマイザーによって必要に応じて更新されますが、UPDATE STATISTICS
またはストアド プロシージャ sp_updatestats を使用して既定の更新より頻繁に統計を更新することでクエリのパフォーマンスを向上できる場合もあります。
統計を更新すると、クエリが最新の統計を使用してコンパイルされるようになります。 任意のプロセスを使用して統計を更新すると、クエリ プランが自動的に再コンパイルされる可能性があります。 パフォーマンスの向上を目的とする場合、クエリ プランの改善とクエリの再コンパイルに要する時間の間にはトレードオフの関係があるため、あまり頻繁に統計を更新しないようにすることをお勧めします。 実際のトレードオフはアプリケーションによって異なります。
UPDATE STATISTICS
では、tempdb
を使用して、統計を作成するための行のサンプルを並べ替えます。
注意
Microsoft Fabric の統計の詳細については、「 Fabric データ ウェアハウスの統計」を参照してください。
構文
SQL Server と Azure SQL Database の構文。
UPDATE STATISTICS table_or_indexed_view_name
[
{
{ index_or_statistics__name }
| ( { index_or_statistics_name } [ , ...n ] )
}
]
[ WITH
[
FULLSCAN
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| SAMPLE number { PERCENT | ROWS }
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| RESAMPLE
[ ON PARTITIONS ( { <partition_number> | <range> } [ , ...n ] ) ]
| <update_stats_stream_option> [ , ...n ]
]
[ [ , ] [ ALL | COLUMNS | INDEX ]
[ [ , ] NORECOMPUTE ]
[ [ , ] INCREMENTAL = { ON | OFF } ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
[ [ , ] AUTO_DROP = { ON | OFF } ]
] ;
<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric_constant ]
Azure Synapse Analytics と Parallel Data Warehouse の構文。
UPDATE STATISTICS [ schema_name . ] table_name
[ ( { statistics_name | index_name } ) ]
[ WITH
{
FULLSCAN
| SAMPLE number PERCENT
| RESAMPLE
}
]
[;]
Microsoft Fabric の構文。
UPDATE STATISTICS [ schema_name . ] table_name
[ ( { statistics_name } ) ]
[ WITH
{
FULLSCAN
| SAMPLE number PERCENT
}
]
[;]
注意
この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。
引数
table_or_indexed_view_name
統計オブジェクトを含むテーブルまたはインデックス付きビューの名前。
index_or_statistics_name または statistics_name | index_name または statistics_name
統計を更新するインデックスの名前、または更新する統計の名前。
index_or_statistics_name または statistics_name を指定しない場合は、クエリ オプティマイザーによってテーブルまたはインデックス付きビューのすべての統計が更新されます。 これには、 CREATE STATISTICS
ステートメントを使用して作成された統計、 AUTO_CREATE_STATISTICS
がオンのときに作成された単一列の統計、およびインデックス用に作成された統計が含まれます。
AUTO_CREATE_STATISTICS
の詳細については、「ALTER DATABASE SET オプション」を参照してください。 テーブルまたはビューのすべてのインデックスを表示するには、sp_helpindex を使用します。
FULLSCAN
テーブルまたはインデックス付きビュー内のすべての行をスキャンして統計を計算します。
FULLSCAN
と SAMPLE 100 PERCENT
は同じ結果になります。
FULLSCAN
SAMPLE
オプションでは使用できません。
SAMPLE number { PERCENT | ROWS }
クエリ オプティマイザーが統計を更新するときに使用する、テーブルやインデックス付きビューに含まれている行のおおよその割合または数を指定します。
PERCENT
の場合、数値は 0 から 100 まで、ROWS
の場合は 0 から行の合計数を指定できます。 クエリ オプティマイザーによってサンプリングされる行の実際の割合や行数が、指定した割合や行数と一致しない場合もあります。 たとえば、データ ページではすべての行がスキャンされます。
SAMPLE
は、既定のサンプリングに基づいてクエリ プランが最適でない特殊な場合に役立ちます。 ほとんどの場合、クエリ オプティマイザーはサンプリングを使用し、高品質のクエリ プランを作成するために必要な統計的に有意なサンプル サイズを既定で決定するため、 SAMPLE
を指定する必要はありません。
注意
SQL Server 2016 (13.x) では、データベース互換性レベル 130 を使用する場合、統計を構築するためのデータのサンプリングが並列で実行され、統計収集のパフォーマンスが向上します。 テーブル サイズが特定のしきい値を超えると、クエリ オプティマイザーは並列サンプル統計を使用します。 SQL Server 2017 (14.x) 以降では、データベースの互換性レベルに関係なく、過剰な LATCH
待機でパフォーマンスの問題が発生する可能性を回避するために、動作がシリアル スキャンの使用に戻されました。 統計の更新中にクエリ プランの残りの部分は、修飾されている場合は並列実行を維持します。
SAMPLE
FULLSCAN
オプションでは使用できません。
SAMPLE
もFULLSCAN
も指定されていない場合、クエリ オプティマイザーはサンプリングされたデータを使用し、既定でサンプル サイズを計算します。
0 PERCENT
または0 ROWS
を指定することをお勧めします。
0 PERCENT
または0 ROWS
を指定すると、統計オブジェクトは更新されますが、統計データは含まれません。
ほとんどのワークロードでは、フル スキャンは必要なく、既定のサンプリングで十分です。 ただし、さまざまなデータ分散の影響を受けやすい特定のワークロードでは、サンプル サイズの増加やフル スキャンが必要になる場合があります。 見積もりは、サンプリングされたスキャンよりもフル スキャンの方が正確になる場合があります。複雑なプランは大きなメリットを得られない可能性があります。
詳細については、「統計のコンポーネントおよび概念」を参照してください。
RESAMPLE
最新のサンプル レートを使用して各統計を更新します。
RESAMPLE
を使用すると、テーブル全体のスキャンが行われることがあります。 たとえば、インデックスの統計では、サンプル レートを取得するためにフル テーブル スキャンが使用されます。 サンプル オプション (SAMPLE
、 FULLSCAN
、 RESAMPLE
) が指定されていない場合、クエリ オプティマイザーはデータをサンプリングし、既定でサンプル サイズを計算します。
Microsoft Fabric の Warehouse では、 RESAMPLE
はサポートされていません。
PERSIST_SAMPLE_PERCENT = { ON | OFF }
適用対象: SQL Server 2016 (13.x) Service Pack 1 CU4、SQL Server 2017 (14.x) Service Pack 1、SQL Server 2019 (15.x) 以降のバージョン、Azure SQL Database、Azure SQL Managed Instance
ON
すると、サンプリング率を明示的に指定しない後続の更新に対する設定されたサンプリング率が統計に保持されます。
OFF
すると、統計サンプリング率は、サンプリング率を明示的に指定しない後続の更新で既定のサンプリングにリセットされます。 既定値は OFF
です。
DBCC SHOW_STATISTICS と sys.dm_db_stats_properties は、選択した統計について保存されたサンプル率値を公開します。
AUTO_UPDATE_STATISTICS
が実行された場合は、永続化されたサンプリング率 (使用可能な場合) を使用するか、そうでない場合は既定のサンプリング率を使用します。
RESAMPLE
動作は、このオプションの影響を受けません。
テーブルが切り詰められた場合、切り詰められたヒープまたは B ツリー (HoBT) に基づいて作成されたすべての統計は、既定のサンプリング率を使用するように元に戻されます。 同様に、行のないオブジェクトで統計が更新された場合、 PERSIST_SAMPLE_PERCENT
が以前に構成されていた場合でも、既定のサンプリング率の使用に戻ります。
注意
SQL Server では、以前に統計が PERSIST_SAMPLE_PERCENT
で更新されたインデックスを再構築すると、永続化されたサンプルの割合が既定値にリセットされます。 SQL Server 2016 (13.x) SP2 CU17、SQL Server 2017 (14.x) CU26、および SQL Server 2019 (15.x) CU10 以降では、インデックスを再構築しても、保存されたサンプル率は維持されます。
ON PARTITIONS ( { <partition_number> | <range> } [ , ...n ] ) ]
適用対象: SQL Server 2014 (12.x) 以降のバージョン
ON PARTITIONS
句で指定されたパーティションをカバーするリーフ レベルの統計を強制的に再計算し、マージしてグローバル統計を作成します。
WITH RESAMPLE
は、異なるサンプル レートで構築されたパーティション統計をマージできないために必要です。
ALL | COLUMNS | INDEX
すべての既存の統計、1 つ以上の列で作成された統計、またはインデックスに対して作成された統計を更新します。 いずれのオプションも指定されていない場合、 UPDATE STATISTICS
ステートメントは、テーブルまたはインデックス付きビューのすべての統計を更新します。
NORECOMPUTE
指定した統計の統計の自動更新オプション ( AUTO_UPDATE_STATISTICS
) を無効にします。 このオプションを指定すると、クエリ オプティマイザーはこの統計の更新を実行し、その後の更新を無効にします。
AUTO_UPDATE_STATISTICS
オプションの動作を再度有効にするには、NORECOMPUTE
オプションを指定せずにUPDATE STATISTICS
をもう一度実行するか、sp_autostats
を実行します。
警告
このオプションを使用すると、最適ではないクエリ プランが作成されることがあります。 このオプションは慎重に使用してください。特に、資格のあるシステム管理者だけが使用することをお勧めします。
AUTO_STATISTICS_UPDATE
オプションの詳細については、「ALTER DATABASE SET オプション」を参照してください。
INCREMENTAL = { ON | OFF }
適用対象: SQL Server 2014 (12.x) 以降のバージョン
ON
すると、パーティション統計に従って統計が再作成されます。
OFF
すると、統計ツリーが削除され、SQL Server によって統計が再計算されます。 既定値は OFF
です。
パーティションごとの統計がサポートされていない場合は、エラーが生成されます。 次の種類の統計では、増分統計がサポートされていません。
- ベース テーブルにパーティションで固定されていないインデックスを使用して作成された統計。
- Always On の読み取り可能なセカンダリ データベースに対して作成された統計。
- 読み取り専用のデータベースに対して作成された統計。
- フィルター選択されたインデックスに対して作成された統計。
- ビューに対して作成された統計。
- 内部テーブルに対して作成された統計。
- 空間インデックスまたは XML インデックスを使用して作成された統計。
MAXDOP = max_degree_of_parallelism
適用対象:SQL Server (SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降)。
統計演算の期間中、 max degree of parallelism
構成オプションをオーバーライドします。 詳細については、「 max degree of parallelism サーバー構成オプションの構成」を参照してください。 並列プランの実行で使用されるプロセッサの数を制限するには、 MAXDOP
を使用します。 最大数は 64 プロセッサです。
max_degree_of_parallelism は次のように指定できます。
1
並列プラン生成を抑制します。
>1
並列統計操作で使用されるプロセッサの最大数を、現在のシステム ワークロードに基づいて指定された数以下に制限します。
0
(既定)
現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。
update_stats_stream_option
単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。
AUTO_DROP = { ON | OFF }
適用対象: SQL Server 2022 (16.x) 以降のバージョン
現在、顧客データベース上のサード パーティ製ツールによって統計が作成されている場合、これらの統計オブジェクトは、顧客が望むスキーマ変更をブロックまたは妨害する可能性があります。
(SQL Server 2022 (16.x 以降)) |この機能を使用すると、スキーマの変更が統計によってブロック
注意
自動作成統計で Auto_Drop プロパティを設定または設定解除しようとすると、エラーが発生する可能性があります。自動作成された統計では、常に自動ドロップが使用されます。 復元時に、一部のバックアップでは、統計オブジェクトが次回更新されるまで (手動または自動で) このプロパティが正しく設定されていない可能性があります。 ただし、自動作成された統計は、自動削除の統計と同様に動作します。
解説
UPDATE STATISTICS を使用する場合
UPDATE STATISTICS
を使用する場合の詳細については、「統計を更新する場合」を参照してください。
制限事項
- テーブルの外部では、統計を更新することはできません。 外部テーブルの統計を更新するには、統計を削除して再作成します。
- 各列ストア インデックスで自動的に作成された統計の更新はサポートされていません。 これを試みると、エラー 35337 が発生します。
UPDATE STATISTICS failed because statistics cannot be updated on a columnstore index. UPDATE STATISTICS is valid only when used with the STATS_STREAM option.
-
MAXDOP
オプションは、STATS_STREAM
、ROWCOUNT
、およびPAGECOUNT
の各オプションと互換性がありません。 -
MAXDOP
オプションは、Resource Governor ワークロード グループのMAX_DOP
の設定によって制限されます (使用されている場合)。
sp_updatestats によるすべての統計の更新
データベース内のすべてのユーザー定義テーブルおよび内部テーブルの統計を更新する方法については、ストアド プロシージャ sp_updatestats を参照してください。 たとえば、次のコマンドは、sp_updatestats
を呼び出してデータベースのすべての統計を更新します。
EXECUTE sp_updatestats;
インデックスと統計の自動管理
アダプティブ インデックス デフラグなどのソリューションを使用して、1 つ以上のデータベースのインデックスの最適化と統計の更新を自動的に管理します。 この手順では、断片化レベルに従ってインデックスを再構築または再構成するか、他のパラメーターの中からインデックスを自動的に選択し、線形しきい値で統計を更新します。
統計の最終更新を決定する
統計の最終更新日を調べるには、 STATS_DATE 関数を使用します。
PDW / Azure Synapse Analytics
次の構文は、Analytics Platform System (PDW) と Azure Synapse Analytics ではサポートされていません。
UPDATE STATISTICS t1 (a, b);
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;
UPDATE STATISTICS t1 (a) WITH STATS_STREAM = 0x01;
アクセス許可
テーブルまたはビューに対する ALTER
権限が必要です。
例
A. テーブルのすべての統計を更新する
次の例では、SalesOrderDetail
テーブルのすべての統計を更新します。
USE AdventureWorks2022;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO
B. 1 つのインデックスの統計を更新する
次の例では、AK_SalesOrderDetail_rowguid
テーブルの SalesOrderDetail
インデックスの統計を更新します。
USE AdventureWorks2022;
GO
UPDATE STATISTICS Sales.SalesOrderDetail (AK_SalesOrderDetail_rowguid);
GO
C. 50% サンプリングで統計を更新する
次の例では、Name
テーブルの ProductNumber
および Product
列に統計を作成し、更新します。
USE AdventureWorks2022;
GO
CREATE STATISTICS Products
ON Production.Product([Name], ProductNumber)
WITH SAMPLE 50 PERCENT;
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product (Products)
WITH SAMPLE 50 PERCENT;
D. FULLSCAN および NORECOMPUTE を使用して統計を更新する
次の例では、Products
テーブル内の Product
統計を更新し、Product
テーブル内のすべての行でフル スキャンを強制的に実行し、Products
統計の自動統計更新を無効にします。
USE AdventureWorks2022;
GO
UPDATE STATISTICS Production.Product (Products)
WITH FULLSCAN, NORECOMPUTE;
GO
例: Azure Synapse Analytics、Analytics Platform System (PDW)
E. テーブルの統計を更新する
次の例では、CustomerStats1
テーブルの Customer
統計を更新します。
UPDATE STATISTICS Customer (CustomerStats1);
F. フル スキャンを使用して統計を更新する
次の例では、CustomerStats1
テーブルのすべての行のスキャンに基づいて Customer
統計を更新します。
UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;
G. テーブルのすべての統計を更新する
次の例では、Customer
テーブルのすべての統計を更新します。
UPDATE STATISTICS Customer;
H. AUTO_DROPで CREATE STATISTICS を使用する
自動削除の統計を使用するには、統計の作成または更新の "WITH" 句に、単に次を追加します。
UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON;
関連するコンテンツ
- 統計
- Microsoft Fabric の統計
- ALTER DATABASE (Transact-SQL)
- sys.dm_db_stats_properties (Transact-SQL)
- sys.dm_db_stats_histogram (Transact-SQL)
- CREATE STATISTICS (Transact-SQL)
- DBCC SHOW_STATISTICS (Transact-SQL)
- DROP STATISTICS (Transact-SQL)
- sp_autostats (Transact-SQL)
- sp_updatestats (Transact-SQL)
- STATS_DATE (Transact-SQL)