前言:最近数据库突然变得卡顿,查看了相关日志后,推测可能是索引碎片以及统计信息的问题,索引碎片很久之前已经写了个job定时处理,应该是跟统计信息的有关,所以写个随笔记录下相关的资料。
什么是统计信息
对于同一句话,SQL SERVER 有很多种方法来完成它。有些方法适合于数据量比较小的时候,有些方法适合于数据量比较大的时候。同一种方法,在数据量不同的时候,复杂度会有非常大的差别。索引只能帮助SQL SERVER找到符合条件的记录。SQL SERVRE 还需要知道每一种操作所要处理的数据量有多少,从而估算出复杂度,选取一个代价最小的执行计划。说得通俗一点,SQL SERVR要能够知道数据是“长得什么样”的,才能用最快的方法完成指令。怎么能够让SQL SERVER知道数据的分布信息呢?在数据库管理系统里有个常用的技术,就是数据的“统计信息”(STATISTICS)。
查询优化器使用统计信息来创建可提高查询性能的查询计划。对于大多数查询,查询优化器已经为高质量的查询计划生成必要的统计信息;查询优化的统计信息是二进制大对象(BLOB),其包含关于表或索引视图的一个或多个列中的值的分布的统计信息。查询优化程序使用这些统计信息来估计查询结果中的基数或行数。这些基数估算使查询优化器能够创建高质量的查询计划。例如,根据您的谓词,查询优化器可以使用基数估计来选择索引查找运算符,而不是资源密集程度更高的索引扫描运算符,如果这样做可以提高查询性能。每个统计对象都在一个或多个表列的列表上创建,并包含显示第一列中值分布的直方图。多列上的统计对象还存储关于列之间的值的相关性的统计信息。这些相关统计信息或密度是从不同行列值的数量中导出的。
查看统计信息
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target ) [ WITH [ NO_INFOMSGS ] < option > [ , n ] ] < option > :: = STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM
上面的sql可根据需求查询对应的统计信息,详细可点击查看微软文档
查得信息后,可参考这篇博客:统计信息含义
统计信息自动更新规则
1、如果统计信息是定义在变通表格上的,那么当发生下面变化之一后,统计信息就被认为是过时的,下次使用时,会自动触发一个更新动作。
(1)表格从没有数据变成有大于等于1条数据
(2)对于数据量小于500行的表格,当统计信息的第一个字段数据累计变化大于500以后。
(3)对于数据量大于500行的表格,当统计信息的第一个字段数据累计变化量大于500 + (20%)
2、临时表(temp table) 上可以有统计信息。其维护策略基本和普通表格一致。但是表变量(table variable) 上不能建统计信息。
这样的维护策略能够保证花费比较小的代价,确保统计信息基本正确。后面会有安例,反映这个维护策略在数据分布特殊的表上,也有可能造成一些负面的影响。
何时创建统计信息
查询优化器已经通过以下方式创建统计信息:
-
查询优化程序在创建索引时为表或视图上的索引创建统计信息。这些统计信息是在索引的键列上创建的。如果索引是筛选索引,则查询优化程序会针对筛选索引指定的相同行子集创建筛选统计信息。有关筛选索引的详细信息,请参阅创建筛选索引和CREATE INDEX(Transact-SQL)。
-
当AUTO_CREATE_STATISTICS打开时,查询优化程序为查询谓词中的单个列创建统计信息。
对于大多数查询,这两种创建统计信息的方法可确保高质量的查询计划; 在少数情况下,您可以通过使用CREATE STATISTICS语句创建其他统计信息来改进查询计划。这些附加统计信息可以捕获查询优化程序在为索引或单列创建统计信息时不会考虑的统计关联。您的应用程序可能在表数据中具有其他统计相关性,如果计算到统计对象中,则可以使查询优化程序能够改进查询计划。例如,对查询谓词列的数据行子集或多列统计信息的筛选统计信息可能会改进查询计划。
使用CREATE STATISTICS语句创建统计信息时,建议保持AUTO_CREATE_STATISTICS选项,以便查询优化器继续定期为查询谓词列创建单列统计信息。有关查询谓词的详细信息,请参阅搜索条件(Transact-SQL)。
当满足以下任何条件时,请考虑使用CREATE STATISTICS语句创建统计信息:
- 数据库引擎优化顾问建议创建统计信息。
- 查询谓词包含多个不在同一索引中的相关列。
- 查询从数据子集中进行选择。
- 该查询缺少统计信息。
详细的信息可参考:SQL文档-统计信息