统计--过滤(筛选)索引的统计信息过期问题测试

基础知识普及:

对于筛选索引,MSDN如是说:

筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。 筛选索引使用筛选谓词对表中的部分行进行索引。 与全表索引相比,设计良好的筛选索引可以提高查询性能、减少索引维护开销并可降低索引存储开销。

筛选索引与全表索引相比具有以下优点:

提高了查询性能和计划质量 设计良好的筛选索引可以提高查询性能和执行计划质量,因为它比全表非聚集索引小并且具有经过筛选的统计信息。  与全表统计信息相比,经过筛选的统计信息更加准确,因为它们只涵盖筛选索引中的行。

减少了索引维护开销 仅在数据操作语言 (DML) 语句对索引中的数据产生影响时,才对索引进行维护。  与全表非聚集索引相比,筛选索引减少了索引维护开销,因为它更小并且仅在索引中的数据更改时才进行维护。 筛选索引的数量可以非常多,特别是在其中包含很少更改的数据时。 同样,如果筛选索引只包含频繁修改的数据,则索引大小较小时可以减少更新统计信息的开销。

减少了索引存储开销 在没必要创建全表索引时,创建筛选索引可以减少非聚集索引的磁盘存储开销。  可以使用多个筛选索引替换一个全表非聚集索引而不会明显增加存储需求。

MSDN地址:http://msdn.microsoft.com/zh-cn/library/cc280372(v=sql.105).aspx

 --========================================================

基础案例介绍:

在很多场景中,过滤索引能解决很多复合索引无法处理的问题,成为一些特殊问题的必杀技,如下面的查询:

SELECT TOP(10) C2
FROM TB1
WHERE C1>5
ORDER BY C2 DESC

如果按C2倒序排序后,排在结果集前面的大多数行都满足C1>5的条件的话,那么我们可以建立以下索引来优化:

CREATE INDEX IDX_C2_INC
ON TB1(C2)
INCLUDE(C1)

但如果满足C1>5的行特别少或者排在结果集尾部的话,那么查询需要遍历索引的大部分才能找到匹配的数据返回给客户,从而导致大量逻辑IO开销。

如果满足C1>5的行比较少,那么可以使用以下索引来优化:

CREATE INDEX IDX_C1_C2
ON TB1(C1,C2)

虽然以上索引能帮助快速找到所有C1<5的行,但仍需要经过一次排序后才能获得TOP(5)的数据,而排序又会导致CPU资源开销。

随着SQL SERVER 2008引入过滤索引后,这样的查询便可以轻松搞定,我们只需要建立以下索引:

CREATE INDEX IDX_C2_WH
ON TB1(C2)
WHERE C1>5

查询可以通过索引很快找到满足C1>5并且按C2排序的TOP 5的数据,最小化地消耗CPU和IO资源。
--===========================================================

在SQL Server中,数据库选择的“自动创建统计(Auto Create Statistics)”选项默认为开启状态, 随着索引的创建,数据库会自动创建与之对应的统计信息,创建过滤索引的过程同样会创建对于的统计信息。

当数据库设置为自动更新统计时(数据库未开启跟踪标志情况下),SQL Server 监控表中的数据更改,当更改满足一下条件之一时更新:
1.向空表插入数据时
2.少于500行的表增加500行或者更多
3.当表中行多于500行时,数据的变化量大于20%时
(在SQL SERVER 2000中,指的是20%的行被修改,而在SQL SERVER 2005/2008中,指的是20%的列数据被修改)

PS: 20%不是一个绝对值

--===========================================================

那么问题出来了,这个20%比例对过滤索引的统计信息是否满足呢?如果满足的话,哪基数是什么呢?是表中的数据还是当前满足条件的数据呢?

让我们来做个测试吧

首先准备测试数据

--创建表,并插入5000行数据
SELECT TOP(5000) 
IDENTITY(INT,1,1) AS ID,
* 
INTO TB001
FROM SYS.all_columns
GO
--创建聚簇索引
CREATE CLUSTERED INDEX IDX_ID
ON TB001(ID)
GO
--创建过滤索引
CREATE INDEX IDX_COLUMNID
ON TB001(object_id)
WHERE Column_id<3
GO
--再导入25000行数据
INSERT INTO TB001
SELECT TOP(5000) 
* 
FROM SYS.all_columns
GO 5
--更新统计信息
UPDATE STATISTICS TB001
GO

查看过滤索引的统计信息

--查看过滤索引的统计信息
DBCC SHOW_STATISTICS('dbo.TB001','IDX_COLUMNID')
GO

目前表中有30000行数据,满足条件的数据是5412行,都超过500行的限制,考虑20%这是一个参考值而不是绝对值,我们测试值调整到50%;为了避免版本问题导致更新行还是更新列的问题,我们统一使用插入方式来测试。

1.首先测试插入5412*50%=2706行数据

--再导入2706行数据
INSERT INTO TB001
SELECT TOP(2706) 
* 
FROM SYS.all_columns
GO
--执行查询尝试触发统计更新
SELECT TOP(1) object_id,COUNT(1)
FROM TB001
WHERE Column_id<3
GROUP BY object_id
ORDER BY COUNT(1) DESC
--查看过滤索引的统计信息 DBCC SHOW_STATISTICS('dbo.TB001','IDX_COLUMNID') GO

统计信息未发生变化,仍旧是:

2.首先测试插入30000*50%=15000行数据(需要考虑之前已插入的2706条数据)

--再导入25000行数据
INSERT INTO TB001
SELECT TOP(5000) 
* 
FROM SYS.all_columns
GO
INSERT INTO TB001
SELECT TOP(5000) 
* 
FROM SYS.all_columns
GO
--由于之前插入2706条数据,因此第三次插入2294
INSERT INTO TB001
SELECT TOP(2294) 
* 
FROM SYS.all_columns
GO
SELECT COUNT(1) FROM TB001--执行查询尝试触发统计更新
SELECT TOP(1) object_id,COUNT(1)
FROM TB001
WHERE Column_id<3
GROUP BY object_id
ORDER BY COUNT(1) DESC
GO --查看过滤索引的统计信息 DBCC SHOW_STATISTICS('dbo.TB001','IDX_COLUMNID') GO

感谢上苍,感谢党,统计更新了,世界和平了,妈妈再也不用担心我的成绩了(毕业很多年啦,泪流满面啊)!!!

--=====================================================

在测试过程中,最开始想使用以下查询来触发:

SELECT TOP(1) object_id
FROM TB001
WHERE Column_id<3
AND Column_id=82873218
ORDER BY object_id
GO
SELECT COUNT(1) FROM TB001
WHERE Column_id<3
GO

结果得出一个错误结论,经多次测试后才发现上述两个查询虽然使用到索引,但是无法触发统计更新。

--=====================================================

总结:无论是复合索引还是过滤索引的统计信息,都是以上一次统计信息更新时表的行数作为基数,当更新达到按20%左右的比例左右后,由查询执行来触发统计自动更新。

PS1: 更新数指的是操作影响的行数,如执行10次UPDATE操作,每次UPDATE影响50行数据,那么更新数为500,即使这10次UPDATE没有改变任何一条数据(类似UPDATE T1 SET C1=C1这类操作)

PS2: 即使更新数达到20%左右,查询使用到该过滤索引,也不一定会触发统计更新,只有查询优化器认为该统计过期并且需要一个更新过的统计信息来生成执行计划时,才会触发统计自动更新

PS2:由于过滤索引的只存放满足过滤条件的数据的特殊性,存在一些场景下,索引数据变化很多而对应的统计信息尚未满足过期(无效)条件,从而导致生成不高效的执行计划,因此有很多高手大神都建议专门针对这些有过滤条件的统计信息制定更新计划,提高其更新频率

PS3:除创建过滤索引会生成有过滤条件的统计信息外,数据库管理员也可以主动添加有过滤条件的统计信息,供执行优化器使用。

--=============================================

漂亮妹子看多了,来点普通的,哈哈

 

转载于:https://www.cnblogs.com/TeyGao/p/4050972.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA连接mysql出现时区错误_idea连接数据库时区错误

错误界面IDEA连接mysql&#xff0c;地址&#xff0c;用户名&#xff0c;密码&#xff0c;数据库名&#xff0c;全都配置好了&#xff0c;点测试连接&#xff0c;咔&#xff01;不成功&#xff01;界面是这样的&#xff0c;翻译过来就是&#xff1a;服务器返回无效时区。进入“高…

LeetCode 1771. 由子序列构造的最长回文串的长度(最长回文子序)

文章目录1. 题目2. 解题1. 题目 给你两个字符串 word1 和 word2 &#xff0c;请你按下述方法构造一个字符串&#xff1a; 从 word1 中选出某个 非空 子序列 subsequence1 。从 word2 中选出某个 非空 子序列 subsequence2 。连接两个子序列 subsequence1 subsequence2 &…

python牛顿法计算平方根_常用的平方根算法详解与实现

本文从属于笔者的数据结构与算法系列文章。 SquareRoot 平方根计算一直是计算系统的常用算法&#xff0c;本文列举出几张简单易懂的平方根算法讲解与实现。其中Java版本的代码参考这里 Reference Babylonian:巴比伦算法/牛顿法 巴比伦算法可能算是最早的用于计算$sqrt{S}$的算法…

什么是spring_Spring 源码第三弹!EntityResolver 是个什么鬼?

上篇文章和小伙伴们说了 Spring 源码中 XML 文件的解析流程&#xff0c;本来可以继续往下走看加载核心类了&#xff0c;但是松哥还是希望能够慢一点&#xff0c;既然要学就学懂&#xff0c;在 XML 文件解析的过程中还涉及到一些其他的类和概念&#xff0c;因此我就先用几篇文章…

从RAID看垂直伸缩到水平伸缩的演化

learn from 从0开始学大数据&#xff08;极客时间&#xff09; 大规模数据存储问题&#xff1a; 容量问题&#xff0c;数据量超过磁盘容量读写速度&#xff0c;磁盘读写慢数据可靠性&#xff0c;磁盘寿命问题 RAID&#xff08;独立磁盘冗余阵列&#xff09; 是将多块普通磁盘…

linux安装g++编译器_Ubuntu Desktop下配置Rosetta安装教程

作者: 吴炜坤本文仅在虚拟机环境下测试&#xff0c;可能实际操作中会遇到不同的问题本文是新手向的安装教程&#xff0c;如果需要在CentOS上安装&#xff0c;可以参考本人其他安装教程由于许多新人朋友在学习Rosetta过程中&#xff0c;通常操作系统选择的都是带美丽漂亮界面便于…

HDFS依然是存储的王者

learn from 从0开始学大数据&#xff08;极客时间&#xff09; 1. HDFS 架构 DataNode 负责数据的存储、读写&#xff0c;HDFS 将文件分割成若干数据块&#xff08;Block&#xff09;&#xff0c;每个 DataNode 存储一部分数据块&#xff0c;文件就分布存储在整个 HDFS 服务器集…

DateTime和字符串转换问题

DateTime和string之间的相互转换经常碰到,可就这么简单的一个转换其中也有些需要注意的地方. 1 static void Main(string[] args)2 {3 string format "yyyy/MM/dd HH:mm:ss";4 DateTimeFormatInfo dtfi DateTimeFormatInf…

.net 5 正式版_.NET 5正式版快来了

微软已在5月19号发布了.NET 5.0的第四个预览版。什么是.NET 5.NET 5.0.NET 5.0是.NET Framework和.NET Core核心的结合&#xff0c;旨在统一.NET平台&#xff0c;微软将其描述为“.NET的未来”&#xff0c;正式版预计将于2020年11月10日发布。.NET 5.0的高级目标包括提供统一的…

天池 在线编程 矩阵还原(前缀和)

文章目录1. 题目2. 解题1. 题目 输入: 2 2 [[1,3],[4,10]] 输出: [[1,2],[3,4]]Explanation: before: 1 2 3 4after: 1 3 4 10https://tianchi.aliyun.com/oj/286606814880453210/327250187142763355 2. 解题 前缀和逆运算 class Solution { public:/*** param n: the row o…

input 输入事件_输入超时为例学习 Python 的线程和协程

需求&#xff1a;做一个程序等待用户输入&#xff0c;3秒内输入则会 echo 这个输入并立即退出。3秒内没输入则自动退出。实现方法&#xff1a;1. 线程&#xff08;错误示范&#xff09;import 首先启动两个线程&#xff0c;并把等待输入的 get_input 设置成 daemon。于是 3 秒后…

PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍...

目前的工作是需要对用户的一些数据进行分析&#xff0c;每个用户都有若干条记录&#xff0c;每条记录中有用户的一个位置&#xff0c;是用经度和纬度表示的。 还有一个给定的数据库&#xff0c;存储的是一些已知地点以及他们的经纬度&#xff0c;内有43W多条的数据。 现在需要拿…

js固定表格行列_纯前端表格控件SpreadJS V14.0发布:组件化编辑器+数据透视表

SpreadJS 是一款基于 HTML5 的纯前端表格控件&#xff0c;兼容 450 种以上的 Excel 公式&#xff0c;具备“高性能、跨平台、与 Excel 高度兼容”的产品特性&#xff0c;可为用户提供高度类似 Excel 的功能&#xff0c;满足 Web Excel组件开发、 表格文档协同编辑、 数据填报、…

天池 在线编程 区间统计(队列)

文章目录1. 题目2. 解题1. 题目 给定一个01数组 arr 和 一个整数 k, 统计有多少区间符合如下条件: 区间的两个端点都为 0 (允许区间长度为1)区间内 1 的个数不多于 k arr 的大小不超过 10^5 样例 1: 输入: arr [0, 0, 1, 0, 1, 1, 0], k 1 输出: 7 解释: [0, 0], [1, 1],…

android 模糊查询控件_第三十二篇:在SOUI2.0中像android一样使用资源

SOUI2.0之前&#xff0c;在SOUI中使用资源通常是直接使用这个资源的name(一个字符串)来引用。使用字符串的好处在于字符串能够表达这个资源的意义&#xff0c;因此使用字符串也是现代UI引擎常用的方式。尽管直接使用字符串有意义明确的优点&#xff0c;它同样也有缺点&#xff…

天池 在线编程 有序队列

文章目录1. 题目2. 解题1. 题目 给出了一个由小写字母组成的字符串 S。 然后&#xff0c;我们可以进行任意次数的移动。 在每次移动中&#xff0c;我们选择前 K 个字母中的一个&#xff08;从左侧开始&#xff09;&#xff0c;将其从原位置移除&#xff0c;并放置在字符串的末…

网站搜索功能怎么实现_电商网站上的搜索功能是如何实现的?

今天是刘小爱自学Java的第159天。感谢你的观看&#xff0c;谢谢你。学习计划安排如下&#xff1a;索引库本质上和数据库类似&#xff0c;也是存储数据的&#xff0c;既然如此自然也会有增删改查。那么这个索引库到底有何特别应用呢&#xff1f;索引库的特别之处在于它的查询&am…

android蓝牙通信_Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信

题记&#xff1a;——不到最后时刻&#xff0c;千万别轻言放弃&#xff0c;无论结局成功与否&#xff0c;只要你拼博过&#xff0c;尽力过&#xff0c;一切问心无愧。通过 Flutter 来进行移动应用开发&#xff0c;打包 Android 、iOS 双平台应用程序&#xff0c;在调用如相机、…

MapReduce既是编程模型又是计算框架

learn from 从0开始学大数据&#xff08;极客时间&#xff09; MapReduce 编程模型 包含 Map 和 Reduce 两个过程 map 的主要输入是一对 <Key, Value> 值&#xff0c;输出一对 <Key, Value> 值将相同 Key 合并&#xff0c;形成 <Key, Value 集合 >再将这个…

MapReduce 计算框架如何运作

learn from 从0开始学大数据&#xff08;极客时间&#xff09; 1. MapReduce 作业启动和运行机制 作业涉及三类关键进程&#xff1a; 大数据应用进程 这类进程是启动 MapReduce 程序的主入口&#xff0c;主要是指定 Map 和 Reduce 类、输入输出文件路径等&#xff0c;并提交作业…