你的位置:首页 > 数据库

[数据库]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

参数

table_or_indexed_view_name

要显示其统计信息的表或索引视图的名称。

target

要显示其统计信息的索引、统计信息或列的名称。 如果 target 是表或索引视图的现有索引或统计信息的名称,则返回有关此目标的统计信息。 如果 target 是现有列的名称,且此列中存在自动创建的统计信息,则返回有关该自动创建的统计信息的信息。 如果列目标中不存在自动创建的统计信息,则返回错误消息 2767。

NO_INFOMSGS

取消严重级别从 0 到 10 的所有信息性消息。

STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM [ ,n ]

如果指定以上一个或多个选项,将根据指定的选项限制该语句返回的结果集。 如果没有指定任何选项,则返回所有统计信息。

实例

下面的示例显示 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个命令的区别和使用方法。