UPDATE STATISTICS (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

テーブルまたはインデックス付きビューで、クエリ最適化に関する統計を更新します。 統計は既定で、クエリ プランを改善するためにクエリ オプティマイザーによって必要に応じて更新されますが、UPDATE STATISTICS またはストアド プロシージャ sp_updatestats を使用して既定の更新より頻繁に統計を更新することでクエリのパフォーマンスを向上できる場合もあります。

統計を更新すると、クエリが最新の統計を使用してコンパイルされるようになります。 任意のプロセスを使用して統計を更新すると、クエリ プランが自動的に再コンパイルされる場合があります。 パフォーマンスの向上を目的とする場合、クエリ プランの改善とクエリの再コンパイルに要する時間の間にはトレードオフの関係があるため、あまり頻繁に統計を更新しないようにすることをお勧めします。 実際のトレードオフはアプリケーションによって異なります。 UPDATE STATISTICS では、tempdb を使用して、統計を作成するための行のサンプルを並べ替えます。

注意

Microsoft Fabric の統計の詳細については、「Microsoft Fabric の統計」を参照してください。

Transact-SQL 構文表記規則

構文

-- Syntax for SQL Server and 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_contant ]  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse 
  
UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  
-- Syntax for Microsoft Fabric

UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
        }  
    ]  
[;]  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

Note

この構文は、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 がオンの場合に作成される 1 列ずつの統計、およびインデックスに対して作成された統計が含まれます。

AUTO_CREATE_STATISTICS の詳細については、「ALTER DATABASE の SET オプション」を参照してください。 テーブルまたはビューのすべてのインデックスを表示するには、sp_helpindex を使用します。

FULLSCAN

テーブルまたはインデックス付きビュー内のすべての行をスキャンして統計を計算します。 FULLSCAN と SAMPLE 100 PERCENT は同じ結果になります。 SAMPLE オプションには FULLSCAN を使用できません。

SAMPLE number { PERCENT | ROWS }

クエリ オプティマイザーが統計を更新するときに使用する、テーブルやインデックス付きビューに含まれている行のおおよその割合または数を指定します。 PERCENT の場合、number には 0 ~ 100 を指定します。ROWS の場合、number には 0 ~合計行数を指定します。 クエリ オプティマイザーによってサンプリングされる行の実際の割合や行数が、指定した割合や行数と一致しない場合もあります。 たとえば、データ ページではすべての行がスキャンされます。

SAMPLE は、既定のサンプリングに基づくクエリ プランが最適ではない特殊な場合に使用できます。 クエリ オプティマイザーは、既定でサンプリングを使用して統計的に有意なサンプル サイズを決定するため、SAMPLE を指定する必要はほとんどありませんが、高品質のクエリ プランを作成する場合は、SAMPLE が必要です。

Note

SQL Server 2016 (13.x) では、データベース互換性レベル 130 を使用する場合、統計を構築するためのデータのサンプリングが並列で実行され、統計収集のパフォーマンスが向上します。 テーブル サイズが特定のしきい値を超えると、クエリ オプティマイザーは並列サンプル統計を使用します。 SQL Server 2017 (14.x) 以降では、データベースの互換性レベルに関係なく、過剰な LATCH 待機でパフォーマンスの問題が発生する可能性を回避するために、動作がシリアル スキャンの使用に戻されました。 統計の更新中のクエリ プランの残りの部分では、修飾されている場合は並列実行がメインされます。

FULLSCAN オプションには SAMPLE を使用できません。 SAMPLE も FULLSCAN も指定しない場合、既定でサンプリングしたデータが使用され、サンプル サイズが計算されます。

0 PERCENT や 0 ROWS を指定することはお勧めしません。 0 PERCENT または 0 ROWS を指定した場合、統計オブジェクトは更新されますが、統計データは含まれません。

ほとんどのワークロードでは、フル スキャンは必要なく、既定のサンプリングで十分です。 ただし、変化するデータ分布の影響を受ける特定のワークロードではサンプル サイズの増加が必要な場合があり、フル スキャンが必要な場合もあります。 見積もりは、サンプリングされたスキャンよりもフル スキャンの方が正確になる場合がありますが、プランを複雑にしてもあまりメリットがない可能性があります。

詳細については、「統計のコンポーネントおよび概念」を参照してください。

RESAMPLE

最新のサンプル レートを使用して各統計を更新します。

RESAMPLE を使用すると、フル テーブル スキャンが実行される場合があります。 たとえば、インデックスの統計では、サンプル レートを取得するためにフル テーブル スキャンが使用されます。 サンプル オプション (SAMPLE、FULLSCAN、RESAMPLE) がいずれも指定されていなければ、既定ではクエリ オプティマイザーはデータをサンプリングしてサンプル サイズを計算します。

Microsoft Fabric のウェアハウスでは、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_STATISTICSsys.dm_db_stats_properties は、選択した統計について保存されたサンプル率値を公開します。

AUTO_UPDATE_STATISTICS が実行された場合、保存されたサンプリング率が使用可能な場合はそのサンプリング率が使用され、そうでない場合は既定のサンプリング率が使用されます。 RESAMPLE の動作は、このオプションの影響を受けません。

テーブルが切り詰められた場合、切り詰められたヒープまたは B ツリー (HoBT) に基づいて作成されたすべての統計は、既定のサンプリング率を使用するように元に戻されます。

Note

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 を使用する場合の詳細については、「統計を更新する場合」を参照してください。

制限事項

  • テーブルの外部では、統計を更新することはできません。 外部テーブルの統計を更新するには、統計を削除して再作成します。
  • MAXDOP オプションは、STATS_STREAMROWCOUNT、および PAGECOUNT の各オプションと互換性がありません。
  • MAXDOP オプションは、Resource Governor ワークロード グループの MAX_DOP の設定によって制限されます (使用されている場合)。

sp_updatestats によるすべての統計の更新

データベース内のすべてのユーザー定義テーブルおよび内部テーブルの統計を更新する方法については、ストアド プロシージャ sp_updatestats を参照してください。 たとえば、次のコマンドは、sp_updatestats を呼び出してデータベースのすべての統計を更新します。

EXEC sp_updatestats;  

インデックスと統計の自動管理

Adaptive Index Defrag のようなソリューションを活用し、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 つのインデックスの統計を更新する

次の例では、SalesOrderDetail テーブルの AK_SalesOrderDetail_rowguid インデックスの統計を更新します。

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;  
GO  

C. 50% サンプリングで統計を更新する

次の例では、Product テーブルの Name および ProductNumber 列に統計を作成し、更新します。

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 を使用して統計を更新する

次の例では、Product テーブル内の Products 統計を更新し、Product テーブル内のすべての行でフル スキャンを強制的に実行し、Products 統計の自動統計更新を無効にします。

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Production.Product(Products)  
    WITH FULLSCAN, NORECOMPUTE;  
GO  

例: Azure Synapse Analytics、Analytics Platform System (PDW)

E. テーブルの統計を更新する

次の例では、Customer テーブルの CustomerStats1 統計を更新します。

UPDATE STATISTICS Customer (CustomerStats1);  

F. フル スキャンを使用して統計を更新する

次の例では、Customer テーブルのすべての行のスキャンに基づいて CustomerStats1 統計を更新します。

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