SQL SERVER 统计信息概述(Statistics)
前言
查询优化器使用统计信息来创建可提高查询性能的查询计划,对于大多数查询,查询优化器已经为高质量查询计划生成必要的统计信息,但是在少数情况下,您需要创建附加的统计信息或者修改查询设计以得到最佳结果。因此理解和合理使用统计信息是数据库优化的方式之一。
统计信息的分类
根据创建源的不同,统计信息分为两种表统计信息和索引统计信息,除非你自定义它们,否则它们之间没有本质的区别。
索引统计信息建立在索引上面,因此对于创建已经存在的数据上,在创建索引的时候会扫描全部数据,这些数据也会创建在索引的统计信息上。
表的统计信息创建在列上面。对于已经存在的数据表上面,需要对某些列使用过滤方法(比如 WHERE,JOIN-ON),会在上面自动建立统计信息。只是它们使用采样数据而不是全部数据。
统计信息的存储
统计信息存储在一系列的系统表中,比如Sysindex,你可以通过系统视图sys.stats 和 Sys.index来查看部分信息。但是详细的信息可以通过系统函数DBCC SHOW_STATISTICS来查看。统计信息本身占用很少的磁盘空间,所以不需要关注是否删除不必要的统计信息来释放更多的磁盘空间。
怎样查看统计信息的更新时间
DBCC SHOW_STATISTICS
语法
DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target ) [ WITH [ NO_INFOMSGS ] < option > [ , n ] ] < option > :: = STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM
参数
要显示其统计信息的表或索引视图的名称。
要显示其统计信息的索引、统计信息或列的名称。 如果 target 是表或索引视图的现有索引或统计信息的名称,则返回有关此目标的统计信息。 如果 target 是现有列的名称,且此列中存在自动创建的统计信息,则返回有关该自动创建的统计信息的信息。 如果列目标中不存在自动创建的统计信息,则返回错误消息 2767。
取消严重级别从 0 到 10 的所有信息性消息。
如果指定以上一个或多个选项,将根据指定的选项限制该语句返回的结果集。 如果没有指定任何选项,则返回所有统计信息。
实例
下面的示例显示 AdventureWorks2012 数据库中 Person.Address 表的 AK_Address_rowguid 索引的所有统计信息
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid);
下面的示例将为 AK_Address_rowguid索引显示的统计信息限制为 HISTOGRAM 数据。
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid) WITH HISTOGRAM;
什么时候需要维护统计信息
- 查询执行时间很长
- 在升序或者是降序键列上发生插入操作
- Truncate 表或者对表大部分列进行大容量的插入后
怎样维护统计信息
SQL Server 提供两个基本的命令来更新统计信息
- sp_updatestats
- update statistics
在后续的文章中将讲述这2个命令的区别和使用方法。