对表或索引视图的一列或多列创建查询优化统计信息,包括筛选的统计信息。对于大多数查询,查询优化器已为高质量查询计划生成必要的统计信息;在少数情况下,您需要使用 CREATE STATISTICS 创建附加的统计信息或修改查询设计以提高查询性能。
筛选的统计信息可以提高从定义完善的数据子集选择数据的查询的查询性能。筛选的统计信息在 WHERE 子句中使用筛选谓词来选择统计信息中包括的数据子集。CREATE STATISTICS 可以使用 tempdb 来将行样本排序以便生成统计信息。
有关统计信息的详细信息,包括何时使用 CREATE STATISTICS,请参阅使用统计信息提高查询性能。
CREATE STATISTICS statistics_name ON { table_or_indexed_view_name } ( column [ ,...n ] ) [ WHERE <filter_predicate> ] [ WITH [ [ FULLSCAN | SAMPLE number { PERCENT | ROWS } | STATS_STREAM = stats_stream ] [ , ] ] [ NORECOMPUTE ] ] ; <filter_predicate> ::= <conjunct> [AND <conjunct>] <conjunct> ::= <disjunct> | <comparison> <disjunct> ::= column_name IN (constant ,…) <comparison> ::= column_name <comparison_op> constant <comparison_op> ::= IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
每个统计信息对象至多可列出 32 列。
何时使用 CREATE STATISTICS
有关何时使用 CREATE STATISTICS 的详细信息,请参阅使用统计信息提高查询性能。
筛选统计信息的引用依赖项
sys.sql_expression_dependencies 目录视图将筛选统计信息谓词中的每一列作为一个引用依赖项跟踪。由于您无法删除、重命名或修改在筛选统计信息谓词中定义的表列的定义,因此在创建筛选统计信息之前应考虑清楚要对表列执行哪些操作。
A. 将 CREATE STATISTICS 与 SAMPLE number PERCENT 一起使用
下面的示例使用 AdventureWorks2008R2 数据库的 Person 表的 BusinessEntityID 和 EmailAddress 列的 5% 作为随机抽样来创建 ContactMail1 统计信息。
USE AdventureWorks2008R2; GO CREATE STATISTICS ContactMail1 ON Person.Person (BusinessEntityID, EmailPromotion) WITH SAMPLE 5 PERCENT;
B. 将 CREATE STATISTICS 与 FULLSCAN 和 NORECOMPUTE 一起使用
下面的示例对 Person 表的 BusinessEntityID 和 EmailAddress 列中的所有行创建 ContactMail2 统计信息,并禁用自动重新计算统计信息。
CREATE STATISTICS NamePurchase ON AdventureWorks2008R2.Person.Person (BusinessEntityID, EmailPromotion) WITH FULLSCAN, NORECOMPUTE;
C. 使用 CREATE STATISTICS 创建筛选统计信息
下面的示例创建筛选统计信息 ContactPromotion1。数据库引擎对 50% 的数据进行采样,然后选择 EmailPromotion 等于 2 的行。
USE AdventureWorks2008R2; GO IF EXISTS (SELECT name FROM sys.stats WHERE name = N'ContactPromotion1' AND object_id = OBJECT_ID(N'Person.Person')) DROP STATISTICS Person.Person.ContactPromotion1 GO CREATE STATISTICS ContactPromotion1 ON Person.Person (BusinessEntityID, LastName, EmailPromotion) WHERE EmailPromotion = 2 WITH SAMPLE 50 PERCENT; GO