UPDATE STATISTICS (Transact-SQL)

更新日期: 2006 年 12 月 12 日

针对指定表或索引视图中的一个或多个统计组(集合),更新有关键值分布的信息。若要创建列的统计信息,请参阅 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
    要更新其统计信息的表或索引视图的名称。表名和视图名必须符合有关标识符的规则。有关详细信息,请参阅使用标识符作为对象名称。由于索引名称在每个数据库中不是唯一的,因此必须指定 tableview。可以根据需要选择指定数据库、表或视图架构。
  • index
    要更新其统计信息的索引。索引名称必须符合标识符规则。如果未指定 index,则更新指定表或索引视图中的所有分布统计信息。这包含使用 CREATE STATISTICS 语句创建的统计信息、自动创建的统计信息以及作为索引创建的副产品创建的统计信息。

    若要显示针对对象的索引的报告,请执行 sp_helpindex,并指定表名或视图名。

  • statistics_name
    要更新的统计信息组(集合)的名称。统计信息名称必须符合有关标识符的规则。有关创建统计信息组的详细信息,请参阅 CREATE STATISTICS (Transact-SQL)
  • FULLSCAN
    指定应读取 tableview 中的所有行以收集统计信息。FULLSCAN 提供与 SAMPLE 100 PERCENT 相同的行为。FULLSCAN 不能与 SAMPLE 选项一起使用。
  • SAMPLE number { PERCENT | ROWS }
    指定在收集较大型的表或视图的统计信息时,要抽样的表或索引视图的百分比或者行数。不管 number 是 PERCENT 还是 ROWS,其值必须为整数。若要对较大型的表或视图使用默认抽样行为,请将 SAMPLE number 和 PERCENT 或 ROWS 一起使用。SQL Server 2005 数据库引擎会确保抽样的最小数量值以保证统计信息有用。如果 PERCENT、ROWS 或 number 选项导致要抽样的行数过小,则数据库引擎将自动根据表或视图中的现有行数改正抽样。至少对大约 1,000 个数据页进行了抽样。如果 PERCENT、ROWS 或 number 选项创建的值多于有用样本所需的值,则数据库引擎将尝试匹配请求的样本数量。但是,由于抽样时要扫描所有数据页,所以实际样本大小可能不会完全等同于指定数量。如果指定 0 PERCENT 或 ROWS,则结果为空统计信息集。

    ms187348.note(zh-cn,SQL.90).gif注意:
    默认行为是对目标表或索引视图执行抽样扫描。数据库引擎会自动计算需要的样本大小。
  • RESAMPLE
    指定收集统计信息时,对现有所有包含索引的统计信息使用继承的抽样率。如果抽样率导致要抽样的行过少,数据库引擎将自动根据表或视图中的现有行数改正抽样。
  • ALL | COLUMNS | INDEX
    指定 UPDATE STATISTICS 语句是否影响列统计信息、索引统计信息或所有现有统计信息。如果不指定任何选项,则 UPDATE STATISTICS 语句将影响所有统计信息。每个 UPDATE STATISTICS 语句只能指定一种类型(ALL、COLUMNS 或 INDEX)。
  • NORECOMPUTE
    指定不自动重新计算过期统计信息。统计信息过期与否取决于对索引列执行的 INSERT、UPDATE 和 DELETE 操作的数量。如果指定此选项,则数据库引擎将禁用自动统计信息重新生成功能。若要恢复自动统计信息重新计算功能,可重新发出不使用 NORECOMPUTE 选项的 UPDATE STATISTICS 或执行 sp_autostats

    ms187348.note(zh-cn,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(zh-cn,SQL.90).gif注意:
UPDATE STATISTICS 语句会重新启用对目标表或视图更新统计信息,指定了 NORECOMPUTE 子句时除外。

权限

要求对表或视图具有 ALTER 权限。

示例

A. 更新单个表的所有统计信息

以下示例将更新表 SalesOrderDetail 的所有索引的分布统计信息。

USE AdventureWorks;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO

B. 仅更新单个索引的统计信息

以下示例仅更新表 SalesOrderDetail 的索引 AK_SalesOrderDetail_rowguid 的分布信息。

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

C. 使用 50% 抽样更新特定统计信息组(集合)的统计信息

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

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 更新特定统计信息组(集合)的统计信息

以下示例将更新表 ProductProducts 统计信息组(集合),强制对表 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。