Share via


UPDATE STATISTICS (Transact-SQL)

更新 : 2006 年 12 月 12 日

指定されたテーブルまたはインデックス付きビュー内の 1 つ以上の統計グループ (コレクション) についてキー値の分布に関する情報を更新します。列の統計を作成するには、「CREATE STATISTICS (Transact-SQL)」を参照してください。

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

構文

UPDATE STATISTICS table | view 
    [ 
        { 
            { index | statistics_name }
          | ( { index |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 | view
    統計を更新するテーブルまたはインデックス付きビューの名前です。テーブル名またはビュー名は、識別子のルールに従っている必要があります。詳細については、「オブジェクト名としての識別子の使用」を参照してください。インデックス名は各データベース内で一意ではないので、table または view を指定する必要があります。データベース、テーブル、またはビュー スキーマの指定は省略可能です。
  • index
    統計が更新対象であるインデックスです。インデックス名は、識別子のルールに従っている必要があります。index を指定しない場合は、指定したテーブルまたはインデックス付きビューのすべての分布統計が更新されます。これには、CREATE STATISTICS ステートメントを使用して作成した統計、自動作成された統計、インデックス作成の副産物として作成された統計も含まれます。

    オブジェクトのインデックスに関するレポートを表示するには、sp_helpindex を実行し、テーブルまたはビュー名を指定します。

  • statistics_name
    更新する統計グループ (コレクション) の名前です。統計の名前は、識別子のルールに従っている必要があります。統計グループの作成の詳細については、「CREATE STATISTICS (Transact-SQL)」を参照してください。
  • FULLSCAN
    統計を収集するために table または view 内のすべての行を読み取ることを指定します。FULLSCAN は、SAMPLE 100 PERCENT と同じ動作を実行します。FULLSCAN では SAMPLE オプションは使用できません。
  • SAMPLE number { PERCENT | ROWS }
    大きなテーブルやビューの統計を収集するときにサンプリングする、テーブルまたはインデックス付きビューの割合や行数を指定します。PERCENT と ROWS のどちらであるかにかかわらず、number は整数にする必要があります。大きなテーブルやビューの既定のサンプリング動作を実行するには、SAMPLE number で PERCENT または ROWS を指定します。SQL Server 2005 データベース エンジンは、役立つ統計を確実に収集するために、最低限の数の値をサンプリングします。PERCENT、ROWS、または number オプションを使用した結果、サンプリングする行数が十分でない場合、データベース エンジンはテーブルまたはビューの既存の行数に基づいて自動的にサンプリングを補正します。少なくとも、約 1,000 データ ページがサンプリングされます。PERCENT、ROWS、または number オプションで、有用なサンプルに必要な数よりも多くの値を得られる場合、データベース エンジンは、要求されたサンプル量に合わせて調整を行います。ただし、すべてのデータ ページをスキャンしてサンプルを収集しているため、実際のサンプル サイズは指定された大きさとまったく同じではありません。0 の PERCENT または ROWS が指定されると、結果は空の統計セットとなります。

    ms187348.note(ja-jp,SQL.90).gifメモ :
    特に指定しない限り、対象のテーブルまたはインデックス付きビューでサンプル スキャンを実行します。データベース エンジンは、必要なサンプル サイズを自動的に計算します。
  • RESAMPLE
    インデックスを含むすべての既存の統計に対して、継承されたサンプリング比率を使用して統計を収集することを指定します。このサンプリング比率を使用した結果、サンプリングする行数が十分でない場合、データベース エンジンはテーブルまたはビューの既存の行数に基づいて自動的にサンプリングを補正します。
  • ALL | COLUMNS | INDEX
    UPDATE STATISTICS ステートメントが、列統計、インデックス統計、またはすべての既存の統計に影響するのかを指定します。どのオプションも指定しない場合、UPDATE STATISTICS ステートメントはすべての統計に影響します。各 UPDATE STATISTICS ステートメントで指定できるのは、ALL、COLUMNS、INDEX のうち 1 つだけです。
  • NORECOMPUTE
    古くなった統計を自動的に再計算しないことを指定します。インデックスが付けられた列で実行した INSERT、UPDATE、および DELETE 操作の数に基づいて、統計は古くなったと判断されます。このオプションを指定した場合、データベース エンジンは自動統計再計算を無効にします。自動統計再計算の設定を復元するには、NORECOMPUTE オプションを指定せずに UPDATE STATISTICS を再実行するか、または sp_autostats を実行します。

    ms187348.note(ja-jp,SQL.90).gif重要 :
    自動統計再計算を無効にすると、クエリ オプティマイザは、指定されたテーブルに関係するクエリに対して最適化の程度が低い方法を選択する可能性があります。
  • <update_stats_stream_option>
    単に情報を示すためだけに特定されます。サポートされていません。将来の互換性は保証されません。

解説

データベース エンジンは、各インデックスのキー値の分布に関する統計をとり、クエリ処理で使用するインデックスを決定する際にそれを使用します。ユーザーは、CREATE STATISTICS ステートメントを使用することにより、インデックスが付けられていない列で統計を作成できます。最適なクエリを作成するためには、正確な分布の統計をとることが不可欠です。

  • インデックスのキー値に大きな変更があった場合は、そのインデックスに対して UPDATE STATISTICS を再実行してください。
  • インデックス列に大量のデータの追加、変更、または削除があった場合 (つまり、キー値の分布が変化した場合) や、TRUNCATE TABLE ステートメントでテーブルを切り捨てた後に再登録が行われた場合は、UPDATE STATISTICS を使用してください。

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

UPDATE STATISTICS WITH RESAMPLE では、テーブル上のすべての統計を現在のサンプリング比率で更新します。つまり、構築時にフル スキャンで作成されるインデックスに関連付けられた統計は、すべてのテーブル スキャンを更新する必要があります。これは特に、多くのインデックスのある大きなパーティション テーブルが含まれていると、とても時間がかかる可能性があります。各統計を更新するには、多くのデータの読み取りが必要です。この問題を回避するには、sp_updatestats (Transact-SQL) の使用を検討してください。これは、必要なときにだけ、統計を更新します。

計算列が含まれるテーブルで統計を作成または更新できるのは、これらの列にインデックスを作成できる場合だけです。計算列にインデックスを作成する場合の条件および制限の詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。

自動統計再計算を無効にした場合は、統計情報を手動で更新する必要があります。

ms187348.note(ja-jp,SQL.90).gifメモ :
UPDATE STATISTICS ステートメントでは、NORECOMPUTE 句が指定されている場合を除き、対象のテーブルまたはビューで自動統計更新を再度有効にすることができます。

権限

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

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

次の例では、 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 テーブル内のすべての行でフル スキャンを強制的に実行し、統計グループ (コレクション) の自動統計更新を無効にします。

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

参照

関連項目

ALTER DATABASE (Transact-SQL)
CREATE INDEX (Transact-SQL)
CREATE STATISTICS (Transact-SQL)
sys.stats (Transact-SQL)
sys.stats_columns (Transact-SQL)
カーソル (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL)
DROP STATISTICS (Transact-SQL)
EXECUTE (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_autostats (Transact-SQL)
sp_createstats (Transact-SQL)
sp_helpindex (Transact-SQL)
sp_updatestats (Transact-SQL)
STATS_DATE (Transact-SQL)

その他の技術情報

関数 (データベース エンジン)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

変更内容 :
  • 「解説」から「UPDATE STATISTICS は、明示的または暗黙的なトランザクションでは許可されません。」という記述を削除しました。SQL Server 2005 にはこの制限が適用されません。