UPDATE STATISTICS (Transact-SQL)UPDATE STATISTICS (Transact-SQL)

適用対象: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

テーブルまたはインデックス付きビューで、クエリ最適化に関する統計を更新します。Updates query optimization statistics on a table or indexed view. 統計は既定で、クエリ プランを改善するためにクエリ オプティマイザーによって必要に応じて更新されますが、UPDATE STATISTICS またはストアド プロシージャ sp_updatestats を使用して既定の更新より頻繁に統計を更新することでクエリのパフォーマンスを向上できる場合もあります。By default, the query optimizer already updates statistics as necessary to improve the query plan; in some cases you can improve query performance by using UPDATE STATISTICS or the stored procedure sp_updatestats to update statistics more frequently than the default updates.

統計を更新すると、クエリが最新の統計を使用してコンパイルされるようになります。Updating statistics ensures that queries compile with up-to-date statistics. ただし、統計の更新によりクエリが再コンパイルされます。However, updating statistics causes queries to recompile. パフォーマンスの向上を目的とする場合、クエリ プランの改善とクエリの再コンパイルに要する時間の間にはトレードオフの関係があるため、あまり頻繁に統計を更新しないようにすることをお勧めします。We recommend not updating statistics too frequently because there is a performance tradeoff between improving query plans and the time it takes to recompile queries. 実際のトレードオフはアプリケーションによって異なります。The specific tradeoffs depend on your application. UPDATE STATISTICS では、tempdb を使用して、統計を作成するための行のサンプルを並べ替えます。UPDATE STATISTICS can use tempdb to sort the sample of rows for building statistics.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- 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 ] 
    ] ;  
  
<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   
        }  
    ]  
[;]  

引数Arguments

table_or_indexed_view_nametable_or_indexed_view_name
統計オブジェクトを含んでいるテーブルまたはインデックス付きビューの名前です。Is the name of the table or indexed view that contains the statistics object.

index_or_statistics_nameindex_or_statistics_name
統計の更新対象のインデックスの名前、または更新する統計の名前を指定します。Is the name of the index to update statistics on or name of the statistics to update. index_or_statistics_name を指定しない場合は、クエリ オプティマイザーによってテーブルまたはインデックス付きビューのすべての統計が更新されます。If index_or_statistics_name is not specified, the query optimizer updates all statistics for the table or indexed view. これには、CREATE STATISTICS ステートメントを使用して作成した統計、AUTO_CREATE_STATISTICS がオンの場合に作成される 1 列ずつの統計、およびインデックスに対して作成された統計が含まれます。This includes statistics created using the CREATE STATISTICS statement, single-column statistics created when AUTO_CREATE_STATISTICS is on, and statistics created for indexes.

AUTO_CREATE_STATISTICS について詳しくは、「ALTER DATABASE の SET オプション (Transact-SQL)」をご覧ください。For more information about AUTO_CREATE_STATISTICS, see ALTER DATABASE SET Options (Transact-SQL). テーブルまたはビューのすべてのインデックスを表示するには、sp_helpindex を使用します。To view all indexes for a table or view, you can use sp_helpindex.

FULLSCANFULLSCAN
テーブルまたはインデックス付きビュー内のすべての行をスキャンして統計を計算します。Compute statistics by scanning all rows in the table or indexed view. FULLSCAN と SAMPLE 100 PERCENT は同じ結果になります。FULLSCAN and SAMPLE 100 PERCENT have the same results. SAMPLE オプションには FULLSCAN を使用できません。FULLSCAN cannot be used with the SAMPLE option.

SAMPLE number { PERCENT | ROWS }SAMPLE number { PERCENT | ROWS }
クエリ オプティマイザーが統計を更新するときに使用する、テーブルやインデックス付きビューに含まれている行のおおよその割合または数を指定します。Specifies the approximate percentage or number of rows in the table or indexed view for the query optimizer to use when it updates statistics. PERCENT の場合、number には 0 ~ 100 を指定します。ROWS の場合、number には 0 ~合計行数を指定します。For PERCENT, number can be from 0 through 100 and for ROWS, number can be from 0 to the total number of rows. クエリ オプティマイザーによってサンプリングされる行の実際の割合や行数が、指定した割合や行数と一致しない場合もあります。The actual percentage or number of rows the query optimizer samples might not match the percentage or number specified. たとえば、データ ページではすべての行がスキャンされます。For example, the query optimizer scans all rows on a data page.

SAMPLE は、既定のサンプリングに基づくクエリ プランが最適ではない特殊な場合に使用できます。SAMPLE is useful for special cases in which the query plan, based on default sampling, is not optimal. クエリ オプティマイザーは、既定でサンプリングを使用して統計的に有意なサンプル サイズを決定するため、SAMPLE を指定する必要はほとんどありませんが、高品質のクエリ プランを作成する場合は、SAMPLE が必要です。In most situations, it is not necessary to specify SAMPLE because the query optimizer uses sampling and determines the statistically significant sample size by default, as required to create high-quality query plans.

SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降では、データのサンプリングによる統計の作成が並列で実行できるようになりました (互換性レベル 130 を使用している場合)。これにより、統計情報収集のパフォーマンスが上がります。Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), sampling of data to build statistics is done in parallel, when using compatibility level 130, to improve the performance of statistics collection. テーブル サイズが一定のしきい値を超えると、クエリ オプティマイザーは並列サンプリングによる統計を使用します。The query optimizer will use parallel sample statistics, whenever a table size exceeds a certain threshold.

FULLSCAN オプションには SAMPLE を使用できません。SAMPLE cannot be used with the FULLSCAN option. SAMPLE も FULLSCAN も指定しない場合、既定でサンプリングしたデータが使用され、サンプル サイズが計算されます。When neither SAMPLE nor FULLSCAN is specified, the query optimizer uses sampled data and computes the sample size by default.

0 PERCENT や 0 ROWS を指定することはお勧めしません。We recommend against specifying 0 PERCENT or 0 ROWS. 0 PERCENT または 0 ROWS を指定した場合、統計オブジェクトは更新されますが、統計データは含まれません。When 0 PERCENT or ROWS is specified, the statistics object is updated but does not contain statistics data.

ほとんどのワークロードでは、フル スキャンは必要なく、既定のサンプリングで十分です。For most workloads, a full scan is not required, and default sampling is adequate.
ただし、変化するデータ分布の影響を受ける特定のワークロードではサンプル サイズの増加が必要な場合があり、フル スキャンが必要な場合もあります。However, certain workloads that are sensitive to widely varying data distributions may require an increased sample size, or even a full scan.
詳しくは、CSS SQL Escalation Services に関するブログをご覧ください。For more information, see the CSS SQL Escalation Services blog.

RESAMPLERESAMPLE
最新のサンプル レートを使用して各統計を更新します。Update each statistic using its most recent sample rate.

RESAMPLE を使用すると、フル テーブル スキャンが実行される場合があります。Using RESAMPLE can result in a full-table scan. たとえば、インデックスの統計では、サンプル レートを取得するためにフル テーブル スキャンが使用されます。For example, statistics for indexes use a full-table scan for their sample rate. サンプル オプション (SAMPLE、FULLSCAN、RESAMPLE) がいずれも指定されていなければ、既定ではクエリ オプティマイザーはデータをサンプリングしてサンプル サイズを計算します。When none of the sample options (SAMPLE, FULLSCAN, RESAMPLE) are specified, the query optimizer samples the data and computes the sample size by default.

PERSIST_SAMPLE_PERCENT = { ON | OFF }PERSIST_SAMPLE_PERCENT = { ON | OFF }
ON の場合、統計では、サンプリング率が明示的に指定されていない後続の更新の設定サンプリング率が保持されます。When ON, the statistics will retain the set sampling percentage for subsequent updates that do not explicitly specify a sampling percentage. OFF の場合、統計サンプリング率は、サンプリング率が明示的に指定されていない後続の更新で既定のサンプリングにリセットされます。When OFF, statistics sampling percentage will get reset to default sampling in subsequent updates that do not explicitly specify a sampling percentage. 既定値は OFF です。The default is OFF.

注意

AUTO_UPDATE_STATISTICS が実行された場合、保存されたサンプリング率が使用可能な場合はそのサンプリング率が使用され、そうでない場合は既定のサンプリング率が使用されます。If AUTO_UPDATE_STATISTICS is executed, it uses the persisted sampling percentage if available, or use default sampling percentage if not. RESAMPLE の動作は、このオプションの影響を受けません。RESAMPLE behavior is not affected by this option.

注意

テーブルが切り捨てられた場合、切り捨てられた HoBT に基づいて作成されたすべての統計は、既定のサンプリング率を使用するように戻されます。If the table is truncated, all statistics built on the truncated HoBT will revert to using the default sampling percentage.

ヒント

DBCC SHOW_STATISTICSsys.dm_db_stats_properties は、選択した統計について保存されたサンプル率値を公開します。DBCC SHOW_STATISTICS and sys.dm_db_stats_properties expose the persisted sample percent value for the selected statistic.

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) (SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU4 以降) 以降 (SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU1 以降)。Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU4) and later (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU1).

ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ] ON PARTITIONS 句で指定したパーティションを対象としたリーフ レベルの統計を強制的に再計算してから、それらをマージして全体統計を構築します。ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ] Forces the leaf-level statistics covering the partitions specified in the ON PARTITIONS clause to be recomputed, and then merged to build the global statistics. 異なるサンプル レートで構築されたパーティションの統計はマージできないため、WITH RESAMPLE が必要になります。WITH RESAMPLE is required because partition statistics built with different sample rates cannot be merged together.

適用対象: SQL Server 2014 (12.x)SQL Server 2014 (12.x) 以降Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later

ALL | COLUMNS | INDEXALL | COLUMNS | INDEX
すべての既存の統計、1 つ以上の列で作成された統計、またはインデックスに対して作成された統計を更新します。Update all existing statistics, statistics created on one or more columns, or statistics created for indexes. 何も指定しない場合は、UPDATE STATISTICS ステートメントによりテーブルまたはインデックス付きビューのすべての統計が更新されます。If none of the options are specified, the UPDATE STATISTICS statement updates all statistics on the table or indexed view.

NORECOMPUTENORECOMPUTE
指定した統計の自動統計更新オプション (AUTO_UPDATE_STATISTICS) を無効にします。Disable the automatic statistics update option, AUTO_UPDATE_STATISTICS, for the specified statistics. このオプションを指定すると、クエリ オプティマイザーはこの統計の更新を実行し、その後の更新を無効にします。If this option is specified, the query optimizer completes this statistics update and disables future updates.

AUTO_UPDATE_STATISTICS オプションの動作を再有効化するには、NORECOMPUTE オプションを指定せずに UPDATE STATISTICS を再実行するか、または sp_autostats を実行します。To re-enable the AUTO_UPDATE_STATISTICS option behavior, run UPDATE STATISTICS again without the NORECOMPUTE option or run sp_autostats.

警告

このオプションを使用すると、最適ではないクエリ プランが作成されることがあります。Using this option can produce suboptimal query plans. このオプションは慎重に使用してください。特に、資格のあるシステム管理者だけが使用することをお勧めします。We recommend using this option sparingly, and then only by a qualified system administrator.

AUTO_STATISTICS_UPDATE オプションについて詳しくは、「ALTER DATABASE の SET オプション (Transact-SQL)」をご覧ください。For more information about the AUTO_STATISTICS_UPDATE option, see ALTER DATABASE SET Options (Transact-SQL).

INCREMENTAL = { ON | OFF }INCREMENTAL = { ON | OFF }
ON の場合、パーティションごとの統計のように統計が再作成されます。When ON, the statistics are recreated as per partition statistics. OFF の場合、統計ツリーが削除され、SQL ServerSQL Server によって統計が再計算されます。When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. 既定値は OFF です。The default is OFF.

パーティションごとの統計がサポートされていない場合は、エラーが生成されます。If per partition statistics are not supported an error is generated. 次の種類の統計では、増分統計がサポートされていません。Incremental stats are not supported for following statistics types:

  • ベース テーブルにパーティションで固定されていないインデックスを使用して作成された統計。Statistics created with indexes that are not partition-aligned with the base table.
  • Always On の読み取り可能なセカンダリ データベースに対して作成された統計。Statistics created on Always On readable secondary databases.
  • 読み取り専用のデータベースに対して作成された統計。Statistics created on read-only databases.
  • フィルター選択されたインデックスに対して作成された統計。Statistics created on filtered indexes.
  • ビューに対して作成された統計。Statistics created on views.
  • 内部テーブルに対して作成された統計。Statistics created on internal tables.
  • 空間インデックスまたは XML インデックスを使用して作成された統計。Statistics created with spatial indexes or XML indexes.

適用対象: SQL Server 2014 (12.x)SQL Server 2014 (12.x) 以降Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
適用対象:SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU3 以降)。Applies to: SQL ServerSQL Server (Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 and SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU3).

統計操作の間、max degree of parallelism 構成オプションをオーバーライドします。Overrides the max degree of parallelism configuration option for the duration of the statistic operation. 詳細については、「 max degree of parallelism サーバー構成オプションの構成」を参照してください。For more information, see Configure the max degree of parallelism Server Configuration Option. 並列プランの実行で使用されるプロセッサ数を制限するには、MAXDOP を使用します。Use MAXDOP to limit the number of processors used in a parallel plan execution. 最大数は 64 プロセッサです。The maximum is 64 processors.

max_degree_of_parallelism は次のように指定できます。max_degree_of_parallelism can be:

11
並列プラン生成を抑制します。Suppresses parallel plan generation.

>1>1
現在のシステム ワークロードに基づいて、並列統計操作で使用される最大プロセッサ数を指定の数以下に制限します。Restricts the maximum number of processors used in a parallel statistic operation to the specified number or fewer based on the current system workload.

0 (既定値)0 (default)
現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。Uses the actual number of processors or fewer based on the current system workload.

<update_stats_stream_option> 単に情報を示すためだけに特定されます。Identified for informational purposes only. サポートされていません。Not supported. 将来の互換性は保証されません。Future compatibility is not guaranteed.<update_stats_stream_option> 単に情報を示すためだけに特定されます。Identified for informational purposes only. サポートされていません。Not supported. 将来の互換性は保証されません。Future compatibility is not guaranteed.

RemarksRemarks

いつ UPDATE STATISTICS を使用するかWhen to Use UPDATE STATISTICS

UPDATE STATISTICS を使用する場合の詳細については、「統計」を参照してください。For more information about when to use UPDATE STATISTICS, see Statistics.

制限事項と制約事項Limitations and Restrictions

  • テーブルの外部では、統計を更新することはできません。Updating statistics is not supported on external tables. 外部テーブルの統計を更新するには、統計を削除して再作成します。To update statistics on an external table, drop and re-create the statistics.
  • MAXDOP オプションは、STATS_STREAMROWCOUNT、および PAGECOUNT の各オプションと互換性がありません。The MAXDOP option is not compatible with STATS_STREAM, ROWCOUNT and PAGECOUNT options.
  • MAXDOP オプションは、Resource Governor ワークロード グループの MAX_DOP の設定によって制限されます (使用されている場合)。The MAXDOP option is limited by the Resource Governor workload group MAX_DOP setting, if used.

sp_updatestats によるすべての統計の更新Updating All Statistics with sp_updatestats

データベース内のすべてのユーザー定義および内部テーブルの統計を更新する方法については、ストアド プロシージャ sp_updatestats (Transact-SQL) の説明を参照してください。For information about how to update statistics for all user-defined and internal tables in the database, see the stored procedure sp_updatestats (Transact-SQL). たとえば、次のコマンドは、sp_updatestats を呼び出してデータベースのすべての統計を更新します。For example, the following command calls sp_updatestats to update all statistics for the database.

EXEC sp_updatestats;  

インデックスと統計の自動管理Automatic index and statistics management

Adaptive Index Defrag のようなソリューションを活用し、1 つまたは複数のデータベースに対するインデックスの最適化と統計更新を自動管理します。Leverage solutions such as Adaptive Index Defrag to automatically manage index defragmentation and statistics updates for one or more databases. このプロシージャでは、断片化レベルやその他のパラメーターに基づいてインデックスを再構築または再構成するか、線形しきい値で統計を更新するかが自動的に選択されます。This procedure automatically chooses whether to rebuild or reorganize an index according to its fragmentation level, amongst other parameters, and update statistics with a linear threshold.

統計の最終更新日の特定Determining the Last Statistics Update

統計の最終更新日を調べるには、 STATS_DATE 関数を使用します。To determine when statistics were last updated, use the STATS_DATE function.

PDW / SQL Data WarehousePDW / SQL Data Warehouse

次の構文は、PDW / SQL Data Warehouse ではサポートされていませんThe following syntax is not supported by PDW / SQL Data Warehouse

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;  

アクセス許可Permissions

テーブルまたはビューに対する ALTER 権限が必要です。Requires ALTER permission on the table or view.

使用例Examples

A.A. テーブルのすべての統計を更新するUpdate all statistics on a table

次の例では、SalesOrderDetail テーブルのすべてのインデックスの統計を更新します。The following example updates the statistics for all indexes on the SalesOrderDetail table.

USE AdventureWorks2012;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B.B. 1 つのインデックスの統計を更新するUpdate the statistics for an index

次の例では、SalesOrderDetail テーブルの AK_SalesOrderDetail_rowguid インデックスの統計を更新します。The following example updates the statistics for the AK_SalesOrderDetail_rowguid index of the SalesOrderDetail table.

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

C.C. 50% サンプリングで統計を更新するUpdate statistics by using 50 percent sampling

次の例では、Product テーブルの Name および ProductNumber 列に統計を作成し、更新します。The following example creates and then updates the statistics for the Name and ProductNumber columns in the Product table.

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.D. FULLSCAN および NORECOMPUTE を使用して統計を更新するUpdate statistics by using FULLSCAN and NORECOMPUTE

次の例では、Product テーブル内の Products 統計を更新し、Product テーブル内のすべての行でフル スキャンを強制的に実行し、Products 統計の自動統計更新を無効にします。The following example updates the Products statistics in the Product table, forces a full scan of all rows in the Product table, and turns off automatic statistics for the Products statistics.

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

例: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) および Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Parallel Data WarehouseParallel Data Warehouse

E.E. テーブルの統計を更新するUpdate statistics on a table

次の例では、Customer テーブルの CustomerStats1 統計を更新します。The following example updates the CustomerStats1 statistics on the Customer table.

UPDATE STATISTICS Customer ( CustomerStats1 );  

F.F. フル スキャンを使用して統計を更新するUpdate statistics by using a full scan

次の例では、Customer テーブルのすべての行のスキャンに基づいて CustomerStats1 統計を更新します。The following example updates the CustomerStats1 statistics, based on scanning all of the rows in the Customer table.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G.G. テーブルのすべての統計を更新するUpdate all statistics on a table

次の例では、Customer テーブルのすべての統計を更新します。The following example updates all statistics on the Customer table.

UPDATE STATISTICS Customer;  

参照See Also

統計 Statistics
ALTER DATABASE (Transact-SQL) ALTER DATABASE (Transact-SQL)
CREATE STATISTICS (Transact-SQL) CREATE STATISTICS (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
DROP STATISTICS (Transact-SQL) DROP STATISTICS (Transact-SQL)
sp_autostats (Transact-SQL) sp_autostats (Transact-SQL)
sp_updatestats (Transact-SQL) sp_updatestats (Transact-SQL)
STATS_DATE (Transact-SQL)STATS_DATE (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL) sys.dm_db_stats_properties (Transact-SQL)
sys.dm_db_stats_histogram (Transact-SQL)sys.dm_db_stats_histogram (Transact-SQL)