Sql Server之旅——第六站 为什么都说状态少的字段不能建索引

 我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道,或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说。。。这样记得快,忘记的也不慢。。。这篇我来分析一下这句话到底有几个意思。

一:现象

首先我们还是用测试数据来发现问题,我先建立一个Person,有5个字段,建表sql如下:


DROP TABLE dbo.PersonCREATE TABLE Person(ID INT PRIMARY KEY IDENTITY,NAME VARCHAR(900),Age INT,Email VARCHAR(20),isMan INT )-- 在isMan字段创建非聚集索引(0:女 1:男)
CREATE INDEX idx_isMan ON dbo.Person(isMan)DECLARE @ch AS INT=0WHILE @ch<=100000
BEGININSERT INTO dbo.Person(NAME,Age,Email,isMan)VALUES(REPLICATE(CHAR(@ch),50),@ch,CAST(CAST(RAND()*1000000000 AS INT) AS VARCHAR(10))+'qq.com',@ch%2)SET @ch=@ch+1
END

通过上面的sql发现ID为聚集索引,isMan为非聚集索引,isMan也就是两种状态(0,1),并且插入10w条记录,截图如下:

sql都做完了,接下来要做的事情就是查询下:isMan=1的记录,如下图:

我靠。。。我明明是在isMan上做数据检索的,怎么就变成 “聚集索引扫描”了???这sqlserver什么意思嘛,居然不走我的“idx_isMan”索引,却走他的“聚集索引(PKPerson3214EC276EF57B66)”。。。。同时也看到上面的”逻辑读取”为521。。。说明在内存中走了521个数据页。但是我不服呀。。。我一定要让执行计划走我的索引。。。办法就是强制指定。。。如下图。

看到上面的图,你是不是已经疯了。。。我才捞5w的数据,你给我走了10w多次数据页。。。这么说1条记录要走两个数据页。。。而扫描聚集索引才走521个数据页,相差200倍。。。难怪执行计划打死也不走“idx_isMan”这条索引。。。

二:分析原因

现在很生气,整个人都不好了,为什么会这样???为了找出问题,我们还得看数据页。


DBCC TRACEON(3604,2588)
DBCC IND(Ctrip,Person,-1)

通过上面的三个图,大概可以看到,10w条数据用了697数据页,其中聚集索引有521个,非聚集索引为176个,这也说明了上面的”聚集索引扫描“走遍了它自己所有的数据页来才捞出数据,同时还发现这两个索引都有一个共同特征就是,只有一个根节点(indexLevel=1)和无数个(indexLevel=0)叶子节点,然后我脑子里面就有一幅图出来了。。。

上面就是我构思出来的图,这个专业一点的名字叫做书签查找。。。我们通过建立”idx_isMan“索引后,就会构建右半图的B树结构,其中索引记录会存放两个值,一个是索引值isMan和一个聚集索引值ID,如果你不相信的话,可以通过DBCC Page去探索"idx_isMan"的索引页,你也可以通过DBCC SHOW_STATISTICS 去查看,如图:

然后引擎通过“idx_isMan“扫描后,拿到了key值,但是非常可惜,我是select * 的,所以必须还要喷出记录中的Name,Emai等l字段,但是”index_isMan"中并没有保存这几个字段,所以必须通过key去”聚集索引“的B树中去找。。。最后通过”聚集索引“的B树找到了目标记录,这也就是所谓的执行计划中的”键查找“,然后喷出”Name,Email“等字段。。。。问题就在这里。。。因为我这样来回的蹦跶蹦跶。。。造成了找出完整的一个记录,需要蹦跶2-3次数据页。。。具体的寻找记录,可参考图中的”紫色线条“,最后也就造成了10w多次蹦跶。。。

三:启示

那这个例子给我们什么启示呢???仔细想想你就知道。。。使用非聚集索引,千万不要捞取过多的数据。。。因为过多的数据会造成在多个B树中来回的蹦跶。。。想要做到捞取数据较少,就必须在高唯一性的字段上建立索引,这样的话在非聚集索引B树中符合的数据相对较少,也就减少了我蹦跶到”主键索引“的B树次数。。。这样的话来回蹦跶的次数远远比”聚集索引“扫描来的实惠,对不对。。。

四:结论

必须在唯一性较高的字段上建立非聚集索引。

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

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

相关文章

概率论复习题+部分详解

概率论与数理统计练习题 1.假设检验中&#xff0c;显著性水平α\alphaα 限制&#xff08;第一类错误&#xff08;拒真错误&#xff09;#&#xff09;的概率 分析&#xff1a; &#xff08;1&#xff09;&#xff0e;原假设为真时拒绝原假设的概率不超过α &#xff08;2&…

【壹刊】Azure AD B2C(一)初识

一&#xff0c;引言&#xff08;上节回顾&#xff09;上一节讲到Azure AD的一些基础概念&#xff0c;以及如何运用 Azure AD 包含API资源&#xff0c;Azure AD 是微软提供的云端的身份标识和资源访问服务&#xff0c;帮助员工/用户/管理员访问一些外部资源和内部资源&#xff1…

英语期末复习unit 3-4课后习题第一题及背诵段落

unit 3 背诵段落&#xff1a; 2 When a recent college graduate came into my office not too long ago looking for a sales job, I asked him what he had done to prepare for the interview. He said he’d read something about us somewhere. 不久前一个新近毕业的大…

操作系统知识点总结+最终版

1、测试题要搞明白 点击可得测试题详解 2、操作系统的四个基本特征&#xff0c;基本功能 操作系统的目标:方便性、有效性、可扩充性、开放性。 操作系统的四大基本特征&#xff1a;1、并发2、共享3、虚拟4、异步&#xff1b; 操作系统的五大功能分别是处理器管理、存储器管理…

如何看云服务器性能,从存储速度看云服务器性能测试

阿 贝云提供免 费云服务器、免 费云虚拟主机&#xff0c;大家有兴趣的可以看看&#xff0c;物超所值喔。衡量存储性能一般看吞吐量(传输速度)和IOPS两个指标。吞吐量主要指大文件的连续读写速度&#xff0c;在大文件的复制、备份等场景适用&#xff0c;用“HD Tune专业版”中的…

操作系统复习题

一、填空题 1&#xff0e;通常所说操作系统的四大模块是指处理机管理、存储管理、设备管理、文件 管理。 2&#xff0e;进程实体是由 进程控制块&#xff08;PCB&#xff09; 、程序段和数据段这三部分组成。 3&#xff0e;文件系统中&#xff0c;空闲存储空间的管理方法有空…

Polly:提升服务可用性

Polly是.NET生态非常著名的组件包一 介绍Polly 的能力• 失败重试&#xff1a;当我们服务调用失败时&#xff0c;能够自动的重试• 服务熔断&#xff1a;当我们服务部分不可用时&#xff0c;我们的应用可以快速响应一个熔断结果&#xff0c;避免持续的请求这些不可用的服务而导…

[汇编语言]实验一:查看CPU和内存,用机器指令和汇编指令编程。

实验一 实验任务: 查看CPU和内存&#xff0c;用机器指令和汇编指令编程。 实验内容: &#xff08;1&#xff09;实验代码: 开始执行命令: &#xff08;2&#xff09;实验代码: &#xff08;3&#xff09;实验代码: 找到了,日期为:01/01/92&#xff0c;这个是虚拟机dos环境(因…

为自己而活,这很难吗?

上周&#xff0c;我的朋友圈被 #翼装飞行失联女生死亡事件# 刷屏了&#xff0c;不知道你有没有被刷到&#xff1f;什么&#xff1f;你不知道这件事&#xff1f;没事&#xff0c;我来简单叙述一下。大致是说一个24岁女大学生翼装飞行员&#xff0c;在张家界天门山景区的一次翼装…

基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录

在开始之前&#xff0c;我们实现一个之前的遗留问题&#xff0c;这个问题是有人在GitHub Issues(https://github.com/Meowv/Blog/issues/8)上提出来的&#xff0c;就是当我们对Swagger进行分组&#xff0c;实现IDocumentFilter接口添加了文档描述信息后&#xff0c;切换分组时会…

操作系统复习题+最终版

一、单选题 1、在单处理器系统中&#xff0c;如果同时存在9个进程&#xff0c;则处于就绪队列中的进程最多有&#xff08;8&#xff09;个。 A.1 B.9 C.10 D.8 分析&#xff1a;不可能出现这样一种情况&#xff0c;单处理器系统9个进程都处于就绪状态&#xff0c;但是8个处于…

[汇编语言]实验二:字的传送

实验二 实验内容: &#xff08;1&#xff09;: &#xff08;2&#xff09;:如果把上面的ax改成al呢&#xff1f; &#xff08;3&#xff09;: &#xff08;4&#xff09;: &#xff08;1&#xff09;实验代码: &#xff08;2&#xff09;实验代码: &#xff08;3&#xf…

Web页面适配移动端方案研究

源宝导读&#xff1a;由于我们ERP目前大都是在在PC上面运行&#xff0c;大家现在关注移动端比较少&#xff0c;谈到移动端适配时&#xff0c;可能都有些生疏也可能比较好奇。以前做过一些移动端的little项目&#xff0c;那么借助这次分享的机会&#xff0c;和大家一起讨论学习下…

计网复习题和知识点+最终版

分析题&#xff1a;出处 1.以太网交换机进行转发决策时使用的 PDU 地址是 _________。 &#xff08;A &#xff09; A&#xff0e;目的物理地址 B.目的 IP 地址 C.源物理地址 D.源 IP 地址 分析&#xff1a;以太网交换机属于数据链路的设备&#xff0c;用的是MAC地址/物理地…