简介: 查询的 统计 信息 : 目前为止,已经介绍了选择索引、维护索引。如果有合适的索引并实时 更新 统计 信息 ,那么优化器会选择有用的索引供查询之用,因为 SQLServer 优化器是基于开销的优化。当在 where 和 on 上的列上的数据需要显示在结果集的时候,
简介:
查询的 统计 信息 :
目前为止,已经介绍了选择索引、维护索引。如果有合适的索引并实时 更新 统计 信息 ,那么优化器会选择有用的索引供查询之用,因为 SQLServer 优化器是基于开销的优化。当在 where 和 on 上的列上的数据需要显示在结果集的时候,如果有实时的 统计 信息 ,优化器会选择最好的执行方式,因为优化器会从 统计 信息 中获得这些数据的明细情况。
在 创建 索引的时候, SQLServer 就会在索引列上 创建 统计 信息 。简单来说, 统计 信息 就是索引或者列上能够描述数据分布的数据。
查询选择性:
公式:列上不重复数据的总数 / 列上的数据总数
选择性越高,索引性能越好,当上述公式的值为 1 时,可以用于做为主键或者唯一键。
创建 和 更新 统计 信息 :
统计 信息 有助于 SQLServer 优化引擎选择合适的索引及相关操作用于执行 SELECT 语句。有两个方式 创建 和 更新 统计 信息 :
1、 手动 创建 和 更新 统计 信息
2、 自动 创建 和 更新 统计 信息
准备工作:
在开始之前,先来看看如何查找数据库的当前 统计 信息 设置:
SELECT CASE WHEN DATABASEPROPERTYEX('master', 'IsAutoCreateStatistics') = 1 THEN 'Yes' ELSE 'No' END AS 'IsAutoCreateStatistics?' , CASE WHEN DATABASEPROPERTYEX('Master', 'IsAutoUpdateStatistics') = 1 THEN 'Yes' ELSE 'No' END AS 'IsAutoUpdateStatistics?' , CASE WHEN DATABASEPROPERTYEX('Master', 'Is_Auto_Update_stats_async_on') = 1 THEN 'Yes' ELSE 'No' END AS 'IsAutoUpdateStatsaAyncOn?' GO
下面的语句用于显示 where 子句中的数据库或者表的 统计 信息 情况:
SELECT object_id , OBJECT_NAME(object_id) AS TableName , name AS StatisticsName , auto_created FROM sys.stats --where object_id=OBJECT_ID('Sales.SalesOrderHeader') ORDER BY object_id DESC GO
还可以使用以下方式查看:
sp_helpstats 'Sales.SalesOrderHeader'
步骤:
1、 现在开始来看看 创建 和 更新 统计 信息 的不同方式,在数据库级别,有一个选项,默认为 ON ,这个选项是: Auto_Create_Statistics :
ALTER DATABASE AdventureWorks SET AUTO_CREATE_STATISTICS ON
2、 启用同步 创建 列上 统计 信息 的选项, Auto_Create_Statistics ,当执行一个查询一个精确数据量的数据时,优化引擎会在这个列上 创建 一个柱状图表。由 SQLServer 创建 的 统计 信息 以 _WA 开头,可以看看这些列表:
SELECT st.name AS StatName , COL_NAME(stc.object_id, stc.column_id) AS ColumnName , OBJECT_NAME(st.object_id) AS TableName FROM sys.stats AS st INNER JOIN sys.stats_columns AS stc ON st.object_id = stc.object_id AND st.stats_id = stc.stats_id WHERE st.name LIKE '_WA%'
3、 上面的 统计 信息 不会因为 Auto_Create_Statistics 选项设为 ON 而结束。这些是强制你的 统计 信息 更新 以保证性能优秀。这个只是定义你的 统计 信息 是否同步 更新 。默认情况下这个选项是为 ON 的。但是有时候不一定符合你的要求,此时可以使用手动 更新 计划:
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS ON
4、 Auto_Update_Statistics 选项会在 创建 索引时、通过 Auto_Create_Statistics 或者用户使用 CREATE STATISTICS 命令手动 创建 统计 信息 时自动 更新 统计 信息 ,下面命令使用异步方式 更新 统计 信息 :
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS_ASYNC ON
5、 此时来看看执行上面语句后的数据库 统计 信息 配置情况:
SELECT is_auto_update_stats_async_on , is_auto_create_stats_on , is_auto_update_stats_on FROM sys.databases WHERE name = 'AdventureWorks'
6、 上面的方式均为自动 创建 和 更新 统计 信息 ,现在来看看如何手动实现:
-- 创建 统计 信息 在Sales.SalesOrderHeader表的DueDate列上 CREATE STATISTICS st_DueDate_SalesOrderHeader ON Sales.SalesOrderHeader(DueDate) GO -- 更新 Sales.SalesOrderHeader表的全部 统计 信息 UPDATE STATISTICS Sales.SalesOrderHeader GO -- 更新 Sales.SalesOrderHeader表的st_DueDate_SalesOrderHeader 统计 信息 UPDATE STATISTICS Sales.SalesOrderHeader st_DueDate_SalesOrderHeader GO -- 更新 数据库中所有可用的 统计 信息 EXEC sys.sp_updatestats GO --手动删除 统计 信息 DROP STATISTICS Sales.SalesOrderHeader.st_DueDate_SalesOrderHeader GO
分析:
当索引 创建 时,优化器会 创建 统计 信息 到索引列所在的表或者视图上,除此之外,如果对 Auto_Create_Statistics 选项设置了 ON ,优化器会 创建 一个单列 统计 信息 ,及时它没有出现在查询的所需列上。如果你觉得一些查询性能有问题,检查所有谓词,如果这些列缺失了 统计 信息 ,你可以手动增加,有时候, DTA (数据库优化顾问)也会建议你 创建 统计 信息 。
一般情况下,在查询编译之前,如果开启了同步 更新 统计 信息 , SQLServer 如果发现 统计 信息 过时,会引发 更新 统计 信息 的操作,然后你的查询就会使用上实时的 统计 信息 。而这个操作会阻塞查询,知道 更新 结束,但是不会保留这些查询,它会 更新 统计 信息 以便下次运行查询的时候可以使用上较新的 统计 信息 。
扩充知识:
默认情况下,只有 sysadmin/db_owner/ 对象的 创建 者这三种角色的成员才有权限 创建 和 更新 统计 信息 。
柱状图:
柱状图是一类由 SQLServer 为了 统计 信息 而生成的表。可以认为是一个显示对应列上 统计 信息 最大和最小值范围的报表。
查看更多关于第十二章SQLServer统计信息(1)创建和更新统计信息的详细内容...