UPDATE STATISTICS (Transact-SQL)

 

適用対象: ○SQL Server (2008 以降)○Azure SQL Database○Azure SQL Data Warehouse ○Parallel Data Warehouse

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

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

Topic link icon 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   
            | SAMPLE number { PERCENT | ROWS }   
            | RESAMPLE   
              [ ON PARTITIONS ( { <partition_number> | <range> } [, …n] ) ]  
            | <update_stats_stream_option> [ ,...n ]  
        ]   
        [ [ , ] [ ALL | COLUMNS | INDEX ]   
        [ [ , ] NORECOMPUTE ]   
        [ [ , ] INCREMENTAL = { ON | OFF } ]  
    ] ;  
  
<update_stats_stream_option> ::=  
    [ STATS_STREAM = stats_stream ]  
    [ ROWCOUNT = numeric_constant ]  
    [ PAGECOUNT = numeric_contant ]  

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
UPDATE STATISTICS schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  

table_or_indexed_view_name
テーブルまたはインデックス付きビューを含む、統計オブジェクトの名前です。

index_or_statistics_name
統計の更新対象のインデックスの名前、または更新する統計の名前を指定します。 場合index_or_statistics_nameが指定されていない、クエリ オプティマイザーがテーブルまたはインデックス付きビューのすべての統計を更新します。 これには、CREATE STATISTICS ステートメントを使用して作成した統計、AUTO_CREATE_STATISTICS がオンの場合に作成される&1; 列ずつの統計、およびインデックスに対して作成された統計が含まれます。

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

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

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

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

SQL Server 2016 から始めて、統計を作成するデータのサンプリングが並列処理、統計コレクションのパフォーマンスを向上させるために、130 の互換性レベルを使用する場合。 テーブルのサイズが一定のしきい値を超えた場合に、クエリ オプティマイザーは parallel のサンプルの統計情報を使用します。

SAMPLE では FULLSCAN オプションは使用できません。 SAMPLE も FULLSCAN も指定しない場合、既定ではクエリ オプティマイザーはサンプリングしたデータを使用してサンプル サイズを計算します。

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

ほとんどのワークロードのフル スキャンする必要はなく、既定のサンプリングが適切です。
ただし、多様なデータの分布を区別できる特定のワークロードは、向上サンプル サイズの場合、または完全なスキャンでも必要があります。
詳細については、次を参照してください。、 CSS SQL エスカレーション サービス ブログします。

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

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

ON PARTITIONS ({ <partition_number>|<>> } [, …n] ) ]</partition_number>
ON PARTITIONS 句で指定したパーティションを対象としたリーフ レベルの統計を強制的に再計算してから、それらをマージして全体統計を構築します。 異なるサンプル レートで構築されたパーティションの統計はマージできないため、WITH RESAMPLE が必要になります。

適用対象: SQL Server 2014 から SQL Server 2016

ALL | COLUMNS | INDEX
すべての既存の統計、1 つ以上の列で作成された統計、またはインデックスに対して作成された統計を更新します。 何も指定しない場合は、テーブルまたはインデックス付きビューのすべての統計が更新されます。

NORECOMPUTE
指定した統計の自動統計更新オプション (AUTO_UPDATE_STATISTICS) を無効にします。 このオプションを指定すると、現在の更新は実行され、その後の更新が無効になります。

AUTO_UPDATE_STATISTICS オプションの動作を再度有効にする、NORECOMPUTE オプションを使用せずに UPDATE STATISTICS を再実行、または実行sp_autostatsします。

System_CAPS_ICON_warning.jpg 警告


このオプションを使用すると、最適ではないクエリ プランが作成されることがあります。 このオプションは慎重に使用してください。特に、資格のあるシステム管理者だけが使用することをお勧めします。

AUTO_STATISTICS_UPDATE オプションの詳細については、次を参照してください。 ALTER DATABASE の SET オプション (TRANSACT-SQL)します。

INCREMENTAL = { ON | OFF }
ONパーティションの統計情報に従って、統計が再作成します。 OFF、統計ツリーが削除されるとSQL Server統計が再計算します。 既定値はOFFします。

パーティションごとの統計がサポートされていない場合は、エラーが生成されます。 次の種類の統計では、増分統計がサポートされていません。

  • ベース テーブルにパーティションで固定されていないインデックスを使用して作成された統計。

  • Always On の読み取り可能なセカンダリ データベースに対して作成された統計。

  • 読み取り専用のデータベースに対して作成された統計。

  • フィルター選択されたインデックスに対して作成された統計。

  • ビューに対して作成された統計。

  • 内部テーブルに対して作成された統計。

  • 空間インデックスまたは XML インデックスを使用して作成された統計。

適用対象: SQL Server 2014 から SQL Server 2016

< update_stats_stream_option >
単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。

UPDATE STATISTICS を使用する場合の詳細については、次を参照してください。統計します。

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

EXEC sp_updatestats;  

統計の最終更新日を調べるには、 STATS_DATE 関数を使用します。

PDW では、次の構文はサポートされていない SQL データ ウェアハウス/

  • 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 AdventureWorks2012;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B. 1 つのインデックスの統計を更新する

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

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

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

次の例は、作成しの統計情報を更新、NameProductNumber内の列、Productテーブルです。

USE AdventureWorks2012;  
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 AdventureWorks2012;  
GO  
UPDATE STATISTICS Production.Product(Products)  
    WITH FULLSCAN, NORECOMPUTE;  
GO  

E. テーブルの統計を更新します。

次の例の更新プログラム、CustomerStats1に関する統計情報、Customerテーブルです。

UPDATE STATISTICS Customer ( CustomerStats1 );  

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

次の例の更新プログラム、CustomerStats1内の行をすべてスキャンに基づいて統計、Customerテーブルです。

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. テーブルのすべての統計を更新する

次の例は、すべての統計を更新、Customerテーブルです。

UPDATE STATISTICS Customer;  

統計情報
ALTER DATABASE (TRANSACT-SQL)
統計 (Transact SQL) の作成します。
DBCC SHOW_STATISTICS (TRANSACT-SQL)
削除に関する統計情報 (TRANSACT-SQL)
sp_autostats (TRANSACT-SQL)
sp_updatestats (TRANSACT-SQL)
STATS_DATE (TRANSACT-SQL)

コミュニティの追加

追加
表示: