次の方法で共有


UPDATE STATISTICS (Transact-SQL)

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

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

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

注意

Microsoft Fabric の統計の詳細については、「 Fabric データ ウェアハウスの統計」を参照してください。

Transact-SQL 構文表記規則

構文

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

テーブルまたはインデックス付きビュー内のすべての行をスキャンして統計を計算します。 FULLSCANSAMPLE 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 オプションでは使用できません。 SAMPLEFULLSCANも指定されていない場合、クエリ オプティマイザーはサンプリングされたデータを使用し、既定でサンプル サイズを計算します。

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

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

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

RESAMPLE

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

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

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_STATISTICSsys.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_STREAMROWCOUNT、および 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;