写点什么

SQL SERVER 的统计信息

作者:lixiaofeng
  • 2021 年 12 月 13 日
  • 本文字数:1376 字

    阅读完需:约 5 分钟

SQL SERVER的统计信息

统计信息介绍

SQL Serve 分析执行计划时,会需要很多基础数据,包括表中各种数据分布情况,如何知道这些数据的分布情况,通过统计信息知道。

统计信息是查询优化器进行查询计划选择的重要依据。

通过统计信息得到数据的分布情况,从而算出查询复杂度,进而选择一个代价小的执行计划。索引的统计信息,大部分时候都是自动更新的,不需要手动维护。

统计信息创建和更新

默认的,SQL Server 会开启 AUTO_CREATE_STATISTICS 和 AUTO_UPDATE_STATISTICS 这两个选项,这个两个选项的作用是自动创建和更新索引统计信息。

alter database db_name SET AUTO_CREATE_STATISTICS ON alter database db_name SET AUTO_UPDATE_STATISTICS  ON
复制代码


何时创建统计信息

  1. 当创建索引时,会自动为索引字段创建统计信息

  2. 当优化器认为需要为某字段创建统计信息时,也会创建

何时更新统计信息

  1. 500

  2. X+X*20% (X 大于 500)

手动更新统计信息

# 更新索引统计信息UPDATE STATISTICS [Order Details](OrdersOrder_Details)
复制代码

备注:统计信息正常情况会自动更新。极个别时候会因为各种原因停止更新。也不用太担心,当查询性能严重下降,好像索引没起作用时,可以查询下索引统计信息,是否长时间未更新。


使用 sys.stats 查看统计信息

select * from sys.stats where object_id=OBJECT_ID('dbo.Orders')
复制代码


如下图红框中所示,0 值代表不是自动添加(比如由于创建索引添加), 1 值代表该统计信息是 sqlsever 自动为该表添加的。



使用 show_statistics 查看的统计信息

--查询所以统计信息dbcc show_statistics('dbo.Orders','idx_cl_od')
复制代码



解读:如图所示,分为三个部分:统计信息的基础信息,数据字段的密度信息,直方图。

基础信息的几个字段

  1. Name,统计信息的名称

  2. Updated,统计信息的最后更新时间

  3. Row,该表数据的行数

  4. Rows Sampled,当前统计信息取样的行数

  5. Steps,数据被分成了多少个桶(直方图会详细介绍)

  6. Density,表示数据的分布密度,即字段中一个数据在表中所占的比例

  7. Average key length,统计信息关键字的平均长度

  8. String Index,当前统计字段是否是字符串信息,若是字符串,会有特殊的标志以优化 like 查询

数据密度

  1. All density,表示对应字段的分布密度, 该值为 1/非重复值个数(密度越小越好,最大密度是 1,对于查询毫无意义)

  2. Average Length,统计信息关键字的平均长度

  3. 统计信息字段的组合情况

直方图:

在统计信息对象中,只有第一个字段会被建立一个直方图,并且该直方图最多建立 200 个桶。

  1. Gange_hi_key,表示一个边界值,是从字段中取出的某一个具体的值

  2. range_rows,表示从上一个边界值到当前边界值存储在的行数,不包括与边界相等的数据

  3. eq_rows,表示与当前边界相等的数据的行数

  4. distinct_range_rows,表示两个边界之间数据去重之后的数据个数

  5. avg_range_rows 表示重复列值的平均数,即 range_rows/distinct_range_rows


当 where 条件中,有两个查询条件,并且这两个条件上都有索引时,应该用哪个呢? 这时,就要用到索引统计信息中的数据密度和直方图了。根据数据密度以及查询的值,对应到直方图的桶中的数据量,看看那个索引的选择性更好,就选择哪个索引。


案例

上次有朋友问我 “最近,数据库查询很慢,数据量,并发等并没有大的变化。”。我建议他查询一下相关的统计信息是否有及时更新。

经过查询发现,统计信息已经一个月没有更新了,手动更新以后,查询慢的现象消失了。

手动更新统计信息

UPDATE STATISTICS table_name index_name
复制代码


发布于: 17 小时前阅读数: 14
用户头像

lixiaofeng

关注

还未添加个人签名 2018.04.25 加入

还未添加个人简介

评论

发布
暂无评论
SQL SERVER的统计信息