sqlserver中复合索引(浅析SQL Server 聚焦索引对非聚集索引的影响)
sqlserver中复合索引
浅析SQL Server 聚焦索引对非聚集索引的影响前言
在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没有任何意义,学习的过程必须同时也是一个思考的过程,无论是独立思考也好还是查资料也罢都是思考而非走马观花,要不然过一段时间又会健忘。简短的内容,深入的理解。
话题
非聚集索引定义:非聚集索引也是一个B树结构,与聚集索引不同的是,B树的叶子节点存的是指向堆或聚集索引的指针。你真的理解了吗??你能举出例子吗??其实本节最终想表达的就是这个意思,定义太长,我们抽象一点来定义并得出最终结论,请往下看。
聚集索引对非聚集索引影响
关于聚集索引和非聚集索引的概念、原理、创建都不会再叙述,若对此不太了解请参考园中其他园友的详细介绍。
首先我们创建测试表
USE SQLStudy GO CREATE TABLE [dbo].[Test]( [ID] [int] NOT NULL, [First] [nchar](10) NULL, [Second] [nchar](10) NULL ) GO
接下来我们再来创建测试数据
INSERT INTO [SQLStudy].[dbo].[Test] ([ID],[First],[Second]) SELECT 1,'First1','Second1' UNION ALL SELECT 2,'First2','Second2' UNION ALL SELECT 3,'First3','Second3' UNION ALL SELECT 4,'First4','Second4' UNION ALL SELECT 5,'First5','Second5' GO
紧接着我们对表上的First和Second列创建聚集索引,如下
CREATE NONCLUSTERED INDEX [IX_MyTable_NonClustered] ON [dbo].[Test] ( [First] ASC, [Second] ASC )
此时我们来同时运行两个查询,看看其执行计划【注】:上一篇已经说过,请启用包括实际执行的计划。
SELECT ID FROM [dbo].[Test] WHERE [First] = 'First1' AND [Second] = 'Second1' SELECT Second FROM [dbo].[Test] WHERE [First] = 'First1' AND [Second] = 'Second1' GO
此时我们看到的执行计划如下:
通过上述毫无疑问我们可以得出结论:查询1是利用的全表扫描,而查询2利用的非聚集索引查找。我们应该对于这个结论没有任何怀疑,因为要第二个查询的Second列在此之前已经创建额非聚集索引,而对于查询1中的ID则没有,所以会造成查询1的全表扫描,而查询2则是非聚集索引查找。
下面我们对表上的列ID创建聚集索引。
CREATE CLUSTERED INDEX [IX_MyTable_Clustered] ON [dbo].[Test] ( [ID] ASC )
此时我们再来运行如下查询:
SELECT ID FROM [dbo].[Test] WHERE [First] = 'First1' AND [Second] = 'Second1' SELECT Second FROM [dbo].[Test] WHERE [First] = 'First1' AND [Second] = 'Second1' GO
此时再来看看查询执行计划:
通过上述我们对列ID创建了聚集索引,我们肯定能立马知道两者都是利用索引查找,确实没错,但是,但是你发现没有,睁大眼睛看看,我们明明在列ID上创建的是聚集索引,理论上应该是聚集索引查找才对啊,这就是我们本文所需要讨论的问题。
问题探讨
我们将问题进行如下概述,当我们在列上创建聚集索引时且查询返回该列,同时查询条件是创建了非聚集索引的列,此时对于创建了聚集索引的列的查询执行计划则是非聚集索引查找,这其中到底发生了什么?
实际发生的情况是非聚集索引内部引用了聚集索引, 当聚集索引被创建后在表中的数据会按照物理逻辑进行排序,当聚集索引没有被创建时此时非聚集索引指向的表中的数据并最终返回数据,但是一旦聚集索引创建了此时非聚集索引则会重建从而此时指向的是聚集索引,说到这里对于园友CareySon对于非聚集索引的描述:非聚集索引也是一个B树结构,与聚集索引不同的是,B树的叶子节点存的是指向堆或聚集索引的指针。概括的非常精准,若创建了聚集索引此时非聚集索引的指针则指向的是聚集索引,否则此时指向的是堆也就是表中的数据。所以此时在这种情况下,当查询创建了聚集索引的列时是进行了非聚集索引查找。
至此,我们可以得出结论:当在检索的列上创建了聚集索引时(仅仅返回创建聚集索引的列),此时查询不会使用聚集索引查找来检索结果而是使用非聚集索引查找来检索结果。
总结
个人觉得对于一个定义出来之前我们得首先抛出这样一个问题,如上述非聚集索引的定义:非聚集索引也是一个B树结构,与聚集索引不同的是,B树的叶子节点存的是指向堆或聚集索引的指针。初次看到这句感觉没什么,泛泛而谈,感觉似乎理解了,当遇到这样的问题时却不知所措,其实就是对定义理解的不够深入或者说不够透,当一个定义出来时你能举出这个定义的例子或者场景,那可能才算是真正了解了。本节我们到此结束,对于SQL这一系列会秉着简短的内容,深入的理解来讲解,同时也会循序渐进讲讲查询性能问题,由抛出问题到最终解决问题才算是收货多多。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多支持开心学习网!
- sql解析器配置(sql字段解析器的实现示例)
- sql server新建用户无法登录(sqlserver 因为选定的用户拥有对象,所以无法除去该用户的解决方法)
- mysql索引提高效率(MySql如何查看索引并实现优化)
- sql server2012下载安装教程(SQL Server 2012 安装与启动图文教程)
- mysql事务级别设置(mysql在项目中怎么选事务隔离级别)
- sqlserver 创建数据库链接(SqlServer数据库远程连接案例教程)
- sqlserver2008数据库的备份(sql server 2008 压缩备份数据库20g)
- mysql备份工具怎么选(MySQL使用Xtrabackup备份流程详解)
- sql查询数据库前五条信息(SQL查询数据库中符合条件的记录的总数)
- sql两列内容合并(分组字符合并SQL语句 按某字段合并字符串之一简单合并)
- sql server数据库权限(SQL Server中通用数据库角色权限的处理详解)
- mysql的字符串截取函数(MySQL实现字符串的拼接,截取,替换,查找位置的操作)
- idea配置mysql最大连接数(IDEA连接不上MySQL端口号占用的解决)
- sqlserver 开启数据库(SQLSERVER简单创建DBLINK操作远程服务器数据库的方法)
- SqlServer 按时间段查询问题(SqlServer 按时间段查询问题)
- mysql乐观锁一定比悲观锁性能高(mysql居然还能实现分布式锁的方法)
- 岳云鹏不说相声,改行演员了 网友 快回来说相声(岳云鹏不说相声)
- 乔欣首演古装大女主,颜值演技双在线(乔欣首演古装大女主)
- 于正又推女性古装大剧 杨蓉乔欣演女配,两位女主成 重头戏(于正又推女性古装大剧)
- 乔欣古装女主戏获热度 作为女主,却没吃到红利(乔欣古装女主戏获热度)
- 爱情是什么(爱情是什么最经典的话)
- 乔欣 古装剧中的高颜值(古装剧中的高颜值)
热门推荐
- web服务器主要有哪些(浅谈Web服务器和应用服务器的区别)
- ASP.NET中() => 的含义
- 微信小程序开发模式(微信小程序引入Vant框架的全过程记录)
- 在网页中嵌入视频
- pythonsocket编写web服务器(局域网内python socket实现windows与linux间的消息传送)
- pythonai识别算法(Python3调用百度AI识别图片中的文字功能示例测试可用)
- html markdown 超链接对比(html+js 实现markdown编辑器效果)
- laravel初始化(Laravel 登录后清空COOKIE的操作方法)
- mysql出现的问题及解决方法(mysql升级到5.7时,wordpress导数据报错1067的问题)
- docker1.12.5容器假死(解决docker run后容器出现Exited 0情况的问题)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9