UPDATE STATISTICS (Transact-SQL)

更新表或索引视图的查询优化统计信息。默认情况下,查询优化器已根据需要更新统计信息以改进查询计划;但在某些情况下,您可以通过使用 UPDATE STATISTICS 或存储过程 sp_updatestats 来比默认更新更频繁地更新统计信息,提高查询性能。

更新统计信息确保查询使用最新的统计信息编译。不过,更新统计信息会导致查询重新编译。我们建议不要太频繁地更新统计信息,因为需要在改进查询计划和重新编译查询所用时间之间权衡性能。此类特定的性能权衡取决于您的应用程序。UPDATE STATISTICS 可以使用 tempdb 来将行样本排序以便生成统计信息。

有关统计信息的详细信息,包括何时使用 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 为 ON 时创建的单列统计信息以及为索引创建的统计信息。

    有关 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 不能与 FULLSCAN 选项一起使用。如果未指定 SAMPLE 和 FULLSCAN,查询优化器则默认使用抽样数据并计算样本大小。

    我们建议不指定 0 PERCENT 或 0 ROWS。如果指定 0 PERCENT 或 0 ROWS,则将更新统计信息对象,但该对象不包含任何统计信息数据。

  • RESAMPLE
    使用最近的采样速率更新每个统计信息。

    使用 RESAMPLE 会导致全表扫描。例如,索引的统计信息使用全表扫描来获取其采样速率。如果未指定采样选项(SAMPLE、FULLSCAN、RESAMPLE),则查询优化器默认将对数据进行抽样并计算样本大小。

  • ALL | COLUMNS | INDEX
    更新所有现有统计信息、在一列或多列上创建的统计信息或为索引创建的统计信息。如果未指定上述任何选项,则 UPDATE STATISTICS 语句将更新表或索引视图上的所有统计信息。

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

B. 更新索引的统计信息

以下示例更新 SalesOrderDetail 表的 AK_SalesOrderDetail_rowguid 索引的统计信息。

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

C. 通过使用 50% 抽样更新统计信息

以下示例将创建并更新 Product 表中的 Name 和 ProductNumber 列的统计信息。

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