ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 筛选统计信息

筛选统计信息

原创 Linux操作系统 作者:iSQlServer 时间:2008-12-18 13:06:49 0 删除 编辑

筛选统计信息是经过优化的统计信息,尤其适用于提高以下这种查询的统计信息准确性:从定义完善的数据子集选择数据的查询。筛选统计信息使用筛选谓词来选择统计信息中包括的数据子集。

筛选统计信息可提高以下类型的查询的查询计划质量:

使用筛选索引的查询。
SQL Server 数据库引擎可自动为筛选索引创建和维护筛选的统计信息。与全表统计信息相比,这些筛选统计信息更加准确,因为它们只涵盖筛选索引中的行。

针对非索引列中数据的子集的查询。
如果未在任何索引中定义某列,并且在查询谓词中引用了该列,则数据库引擎可以针对该列创建全表统计信息,以便改进查询计划。如果非索引列包含具有唯一数据分布的数据子集,则有关行子集的筛选统计信息可以提高查询优化器用于查询计划的统计信息的准确性。

从相关列中选择数据的查询。
如果查询从某一非索引列中选择数据,而该列包含与其他列中的值相关的数据子集,则筛选统计信息可以改进查询计划。如果在此非索引列中执行的数据查找次数较少,则筛选后索引可能不会明显提高数据查找的性能。但是,有关非索引列中数据子集的筛选统计信息可以提高查询计划的质量。

 设计注意事项
为了设计有效的筛选统计信息,必须了解应用程序使用何种查询以及这些查询与数据子集的关联。以下设计注意事项举例说明了何时应创建筛选统计信息。

筛选索引
由于数据库引擎自动创建和更新有关筛选索引中行的筛选统计信息,因此必须了解如何设计筛选索引。筛选索引及其筛选统计信息都使用基于简单比较运算符的同一筛选谓词表达式进行定义。有关设计和创建筛选索引的详细信息,请参阅筛选索引设计准则和 CREATE INDEX (Transact-SQL)。

非索引列
筛选统计信息可以提高有关没有筛选索引的行子集的统计信息准确性。可以通过使用 CREATE STATISTICS 命令并在此命令中用 WHERE 子句定义筛选谓词表达式来创建筛选统计信息。有关详细信息,请参阅 CREATE STATISTICS (Transact-SQL)。

正如简介中所提到的,数据库引擎可以自动生成有关非索引列的整表统计信息,以便改进查询计划。查询优化器不会自动生成筛选统计信息。如果相应列包含具有不同数据分布的数据子集,则可以创建供查询优化器使用的筛选统计信息,以取代自动生成的全表统计信息。

可以使用下面的查询来确定查询优化器是否具有针对某列自动生成的统计信息。它将查询动态管理视图 sys.stats 和 sys.stats_columns,以返回具有自动生成的统计信息的所有列的数据库对象名、列名和统计信息名称。查询优化器自动生成有关非索引列的统计信息时,统计信息名称以 _WA 开头。

 
USE AdventureWorks;
GO
SELECT OBJECT_NAME(s.object_id) AS object_name,
    COL_NAME(sc.object_id, sc.column_id) AS column_name,
    s.name AS statistics_name
FROM sys.stats AS s Join sys.stats_columns AS sc
    ON s.stats_id = sc.stats_id
WHERE s.name like '_WA%'
ORDER BY s.name;
GO
相关列
如果查询从某一非索引列中选择数据,而该列包含与其他列中的值相关的数据子集,则筛选统计信息可以改进查询计划。例如,使用 AdventureWorks 时,Production.Product 表中的每种产品属于 Production.ProductCategory 表中的以下四种类别之一:Bikes、Components、Clothing 和 Accessories。上述每种类别在重量方面的数据分布均不同:自行车的重量范围为 13.77 到 30.0,部件的重量范围为 2.12 到 1050.00 且有些部件的重量为 NULL 值,服装的重量全部为 NULL,附件的重量也为 NULL。

 
USE AdventureWorks;
GO
IF EXISTS ( SELECT name FROM sys.stats
    WHERE name = 'BikeWeights'
    AND object_ID = OBJECT_ID ('Production.Product'))
DROP STATISTICS Production.Product.BikeWeights;
GO
CREATE STATISTICS BikeWeights
    ON Production.Product (Weight)
WHERE ProductSubcategoryID IN (1,2,3);
GO
查询优化器可使用 BikeWeights 筛选统计信息来改进下面这个查询的查询计划,此查询选择重量超过 25 的所有自行车。

 
SELECT P.Weight AS Weight, S.Name AS BikeName
FROM Production.Product AS P
    JOIN Production.ProductSubcategory AS S
    ON P.ProductSubcategoryID = S.ProductSubcategoryID
WHERE P.ProductSubcategoryID IN (1,2,3) AND P.Weight > 25
ORDER BY P.Weight;
GO引用依赖项
sys.sql_expression_dependencies 目录视图将筛选统计信息谓词中的每一列作为一个引用依赖项跟踪。由于您无法删除、重命名或修改在筛选统计信息谓词中定义的表列的定义,因此在创建筛选统计信息之前应考虑清楚要对表列执行哪些操作。

抽样率
筛选索引采用默认的抽样率来创建筛选统计信息。使用 CREATE STATISTICS 语句创建筛选统计信息时,可以选择抽样率。但是,如果只返回几个值,则这种抽样可能无法提供准确的统计信息。对于返回相对较少值的高选择性谓词,使用 WITH FULLSCAN 选项会提高准确性,因为该选项将扫描所有值而不是抽样扫描。有关 WITH FULLSCAN 选项的用法信息,请参阅 CREATE STATISTICS (Transact-SQL)。

统计信息自动更新
除非您禁用统计信息自动重新计算功能,然后对其进行手动更新,否则筛选统计信息会自动更新。在统计信息自动更新过程中,用于筛选统计信息的默认抽样率将因筛选统计信息谓词的选择性而异。有关更新统计信息的详细信息,请参阅 UPDATE STATISTICS (Transact-SQL)。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-515884/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-10-17

  • 博文量
    1319
  • 访问量
    2105635