一.概述
sql server在快速查询值时只有索引还不够,还需要知道操作要处理的数据量有多少,从而估算出复杂度,选择一个代价小的执行计划,这样sql server就知道了数据的分布情况。索引的统计值信息,还内置策略用来在没有索引的属性列上创建统计值。在有索引和没有索引的属性列上统计值信息会被自动维护。大部分场景下不需要手动去维护统计信息。
作用是 sqlserver 查询优化器使用统计信息来创建可提高查询性能的查询计划。 对于大多数查询,查询优化器已为高质量查询计划生成必要的统计信息。每个索引都会自动建立统计信息, 统计信息的准确性直接影响指令的速度,执行计划的选择是依据统计信息。
1.1 属性列统计值
默认情况下,每当在一个查询的where子句中使用非索引属性列时,sqlserver会自动地创建统计值,统计名称以_WA_Sys开头。
复制代码
-- 查看表中非索引的统计信息
sp_helpstats PUB_Search_Log
复制代码
如下所示:
1.2 自动更新统计信息的阀值
在自动更新统计信息选项 AUTO_UPDATE_STATISTICS 为 ON 时,查询优化器将确定统计信息何时可能过期。查询优化器通过计算自最后统计信息更新后数据修改的次数并且将这一修改次数与某一阈值进行比较,确定统计信息何时可能过期。
(1)如果在评估时间统计信息时表基数为 500 或更低,则每达到 500 次修改时更新一次。
(2)如果在评估时间统计信息时表基数大于 500,则改变每达到 500 + 20%的行数更新一次(大表特别要注意更新时间)。
二. 统计信息分析
复制代码
--查询统计信息
DBCC SHOW_STATISTICS(tablename,'indexname')
复制代码
下面是一个复杂的统计信息,上一次更新统计信息时间是2018年5月8日,距离现在有二个多月没更新了,也就是说更新条件没有达到(改变达到500次 + 20%的行数变动)。
2.1 统计信息三部分:头信息,字段选择性,直方图。
(1) 头信息
name:统计信息名称,也是索引的名字。
updated:上一次统计信息更新时间(重要)。
rows:上一次统计表中的行数,反映了表里的数据量。
rows Sampled: 用于统计信息计算的抽样总行数。当表格数据比较大,为了降低消耗,只会取一小部分数据做抽样。 rows sampled