UPDATE STATISTICS (Transact-SQL)

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

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

統計の詳細 (UPDATE STATISTICS を使用する場合など) については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

UPDATE STATISTICS table_or_indexed_view_name 
    [ 
        { 
            { index_or_statistics__name }
          | ( { index_or_statistics_name } [ ,...n ] ) 
                }
    ] 
    [    WITH 
        [ 
            [ FULLSCAN ] 
            | SAMPLE number { PERCENT | ROWS } ] 
            | RESAMPLE 
            | <update_stats_stream_option> [ ,...n ]
        ] 
        [ [ , ] [ ALL | COLUMNS | INDEX ] 
        [ [ , ] NORECOMPUTE ] 
    ] ;

<update_stats_stream_option> ::=
    [ STATS_STREAM = stats_stream ]
    [ ROWCOUNT = numeric_constant ]
    [ PAGECOUNT = numeric contant ]

引数

  • 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 オプションは使用できません。

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

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

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

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

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

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

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

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

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

    注記注意

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

    AUTO_STATISTICS_UPDATE オプションの詳細については、「ALTER DATABASE の SET オプション (Transact-SQL)」を参照してください。統計の更新の無効化および再有効化の詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。

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

説明

UPDATE STATISTICS を使用する場合

UPDATE STATISTICS を使用する場合の詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。

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

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

EXEC sp_updatestats

統計の最終更新日の特定

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

権限

テーブルまたはビューに対する ALTER 権限が必要です。

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

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

USE AdventureWorks;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO

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

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

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

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

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

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

変更履歴

変更内容

より正確な内容にするためにドキュメント全体を修正しました。

クエリのパフォーマンスを向上させるための統計の使用」の統計に関する新しい記述を参照しています。