SQL SERVER 的统计信息
统计信息介绍
SQL Serve 分析执行计划时,会需要很多基础数据,包括表中各种数据分布情况,如何知道这些数据的分布情况,通过统计信息知道。
统计信息是查询优化器进行查询计划选择的重要依据。
通过统计信息得到数据的分布情况,从而算出查询复杂度,进而选择一个代价小的执行计划。索引的统计信息,大部分时候都是自动更新的,不需要手动维护。
统计信息创建和更新
默认的,SQL Server 会开启 AUTO_CREATE_STATISTICS 和 AUTO_UPDATE_STATISTICS 这两个选项,这个两个选项的作用是自动创建和更新索引统计信息。
何时创建统计信息
当创建索引时,会自动为索引字段创建统计信息
当优化器认为需要为某字段创建统计信息时,也会创建
何时更新统计信息
500
X+X*20% (X 大于 500)
手动更新统计信息
备注:统计信息正常情况会自动更新。极个别时候会因为各种原因停止更新。也不用太担心,当查询性能严重下降,好像索引没起作用时,可以查询下索引统计信息,是否长时间未更新。
使用 sys.stats 查看统计信息
如下图红框中所示,0 值代表不是自动添加(比如由于创建索引添加), 1 值代表该统计信息是 sqlsever 自动为该表添加的。
使用 show_statistics 查看的统计信息
解读:如图所示,分为三个部分:统计信息的基础信息,数据字段的密度信息,直方图。
基础信息的几个字段:
Name,统计信息的名称
Updated,统计信息的最后更新时间
Row,该表数据的行数
Rows Sampled,当前统计信息取样的行数
Steps,数据被分成了多少个桶(直方图会详细介绍)
Density,表示数据的分布密度,即字段中一个数据在表中所占的比例
Average key length,统计信息关键字的平均长度
String Index,当前统计字段是否是字符串信息,若是字符串,会有特殊的标志以优化 like 查询
数据密度:
All density,表示对应字段的分布密度, 该值为 1/非重复值个数(密度越小越好,最大密度是 1,对于查询毫无意义)
Average Length,统计信息关键字的平均长度
统计信息字段的组合情况
直方图:
在统计信息对象中,只有第一个字段会被建立一个直方图,并且该直方图最多建立 200 个桶。
Gange_hi_key,表示一个边界值,是从字段中取出的某一个具体的值
range_rows,表示从上一个边界值到当前边界值存储在的行数,不包括与边界相等的数据
eq_rows,表示与当前边界相等的数据的行数
distinct_range_rows,表示两个边界之间数据去重之后的数据个数
avg_range_rows 表示重复列值的平均数,即 range_rows/distinct_range_rows
当 where 条件中,有两个查询条件,并且这两个条件上都有索引时,应该用哪个呢? 这时,就要用到索引统计信息中的数据密度和直方图了。根据数据密度以及查询的值,对应到直方图的桶中的数据量,看看那个索引的选择性更好,就选择哪个索引。
案例
上次有朋友问我 “最近,数据库查询很慢,数据量,并发等并没有大的变化。”。我建议他查询一下相关的统计信息是否有及时更新。
经过查询发现,统计信息已经一个月没有更新了,手动更新以后,查询慢的现象消失了。
手动更新统计信息
版权声明: 本文为 InfoQ 作者【lixiaofeng】的原创文章。
原文链接:【http://xie.infoq.cn/article/1b61a958f940f1fca55ca3191】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论