CREATE STATISTICS (Transact-SQL)

通过表或索引视图的已提供列或一组列创建柱状图和关联的密度组(集合)。另外,还基于在 charvarcharvarchar(max)ncharnvarcharnvarchar(max)textntext 列中生成的统计信息创建字符串摘要统计信息。查询优化器使用此统计信息为检索或更新数据选择最有效的计划。最新的统计信息允许优化器准确地估计不同查询计划的开销,并选择高质量的计划。有关 SQL Server 2005 中统计信息的详细信息,请参阅 Microsoft TechNet 上的 Microsoft SQL Server 2005 中查询优化器所使用的统计信息

主题链接图标Transact-SQL 语法约定

语法

CREATE STATISTICS statistics_name 
ON { table | view } ( column [ ,...n ] ) 
    [ WITH 
        [ [ FULLSCAN 
          | SAMPLE number { PERCENT | ROWS } 
          | STATS_STREAM = stats_stream ] [ , ] ] 
        [ NORECOMPUTE ] 
    ] ;

参数

  • statistics_name
    要创建的统计组的名称。统计名称必须符合标识符的规则,并且对创建时所基于的表或视图必须是唯一的。
  • table
    要在其中创建命名统计的表的名称。表名必须符合标识符规则。table 是与 column 关联的表。指定表的所有者名称是可选的。通过指定限定的表名,可以在另一个数据库的表中创建统计信息。
  • view
    要在其中创建命名统计的视图的名称。在视图中创建统计信息之前,视图必须有聚集索引。视图名称必须符合标识符规则。view 是与 column 关联的视图。根据需要,指定视图的所有者名称。通过指定限定视图名称,可以在另一个数据库中的视图中创建统计信息。
  • column
    要在其中创建统计信息的一列或一组列。任何可指定为索引键的列也可以为统计信息指定,但下列情况除外:

    • 不能指定 xml 列。
    • 组合的列值的最大允许值可以超出为索引键值规定的 900 个字节的限制。

    只有当 ARITHABORT 和 QUOTED_IDENTIFIER 数据库选项设置为 ON 时,才能指定计算列。如果 CLR 用户定义类型支持二进制排序,则可以指定 CLR 用户定义类型列。如果方法具有确定性标记,可以指定定义为用户定义类型的列的方法调用的计算列。有关 CLR 用户定义类型的列的详细信息,请参阅使用 CLR 用户定义类型

  • FULLSCAN
    指定应读取 tableview 中的所有行以收集统计信息。指定 FULLSCAN 具有与 SAMPLE 100 PERCENT 相同的行为。此选项不能与 SAMPLE 选项一起使用。
  • SAMPLE number { PERCENT | ROWS }
    指定通过随机抽样应读取的数据百分比或指定的数据行数,收集统计信息。number 必须为整数。如果指定了 PERCENT,则 number 应该在 0 至 100 之间;如果指定了 ROWS,则 number 可以在 0 至总行数 n 之间。

    SQL Server 2005 数据库引擎将确保值的抽样数不低于某一数目,以保证统计信息有用性。如果使用 PERCENT、ROWS 或 number 选项导致要抽样的行数过小,则数据库引擎将自动根据表或视图中的现有行数改正抽样。至少对大约 1,000 个数据页进行了抽样。如果使用 PERCENT、ROWS 或 number 选项导致值多于有用样本所需的值,则数据库引擎将尝试匹配请求的样本数量。不过,因为样本是通过扫描整个数据页采集的,实际样本大小可能无法完全匹配指定的量。如果指定 0 PERCENT 或 ROWS,则结果为空统计信息集。

    SAMPLE 不能与 FULLSCAN 选项一起使用。如果不指定 SAMPLE 或 FULLSCAN,则由数据库引擎计算自动样本。

  • NORECOMPUTE
    指定数据库引擎不应自动重新计算统计信息。如果指定了该选项,那么即使数据发生更改,数据库引擎仍将继续使用以前创建的(旧)统计信息。数据库引擎不自动更新和维护统计信息。这可能会生成不理想的计划。

    ms188038.Caution(zh-cn,SQL.90).gif注意:
    建议您限制此选项的使用,只能由有资格的系统管理员使用。
  • STATS_STREAM **=**stats_stream
    此语法仅供内部使用,不支持此语法。Microsoft 保留了随时更改此语法的权限。

备注

只有表的所有者才能对该表创建统计。不管表中是否有数据,表的所有者都可以在任何时候创建统计组(集合)。

如果 AUTO_UPDATE_STATISTICS 数据库选项设置为 ON(这是默认设置)并且不指定 NORECOMPUTE 子句,数据库引擎将自动更新任何手动创建的统计信息。

CREATE STATISTICS 可以对索引视图执行。只有在查询直接引用视图并为该视图指定了 NOEXPAND 提示的情况下,优化器才会使用索引视图的统计信息。否则,在索引视图被代入查询计划之前,从基础表派生统计信息。仅在 Microsoft SQL Server 2005 Enterprise Edition 和 Developer Edition 中支持这种替换。

权限

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

示例

A. 将 CREATE STATISTICS 与 SAMPLE number PERCENT 一起使用

下面的示例创建 ContactMail1 统计组(集合)。此示例对 AdventureWorks 数据库的 Contact 表的百分之五的 ContactIDEmailAddress 列计算随机抽样统计信息。

USE AdventureWorks;
GO
CREATE STATISTICS ContactMail1
    ON Person.Contact (ContactID, EmailAddress)
    WITH SAMPLE 5 PERCENT;

B. 将 CREATE STATISTICS 与 FULLSCAN 和 NORECOMPUTE 一起使用

下面的示例创建 ContactMail2 统计组(集合)。此示例对 Contact 表的 ContactIDEmailAddress 列中的所有行计算统计信息,并禁用自动重新计算统计信息。

CREATE STATISTICS NamePurchase
    ON AdventureWorks.Person.Contact (ContactID, EmailAddress)
    WITH FULLSCAN, NORECOMPUTE;

请参阅

参考

ALTER DATABASE (Transact-SQL)
CREATE INDEX (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL)
DROP STATISTICS (Transact-SQL)
sys.stats (Transact-SQL)
sys.stats_columns (Transact-SQL)
sp_autostats (Transact-SQL)
sp_createstats (Transact-SQL)
UPDATE STATISTICS (Transact-SQL)
EVENTDATA (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助