博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
索引对查询效率的影响
阅读量:7116 次
发布时间:2019-06-28

本文共 1775 字,大约阅读时间需要 5 分钟。

0.参考文献

1.实验数据

我们将利用AdvantureWords2008R2中的Sales.SalesOrderDetail表,其中有12万条数据,非常适合用于测试。不过我们不直接在这张表上做测试,因为这张表上已经有索引了。我们需要新建一张表,将该表中的数据导入我们新建的test和test2表。test和test2的创建方法有两种,我们选择第二种。

View Code

2.聚集索引与非聚集索引对查询效率的影响

下面我们将通过实验来说明聚集索引和非聚集索引在查询效率上的影响。根据logic read以及execution plan我们能够更加清晰知道索引的结构,以及sql server是如何查找数据的。

View Code

3.复合索引

数据库中经常会存在复合索引,那么复合索引在什么情况下会起到查询优化作用,又在什么情况下起不到作用呢。如果查询条件是复合索引的非leading column,那么索引不起作用,不会使用这个复合索引。

View Code

 PS:2012-9-3

今天看到了博客园中的,看着觉得有点不对劲,所以对文中的疑点进行测试。

疑问一:一次查询只能使用一个索引

参考:

首先我们准备实验数据,在这里我新建一张OrderDetail2,并将adventureworks2008r2的 AdventureWorks2008R2.Sales.SalesOrderDetail表中的其中四列导入OrderDetail2表中,TSQL如下所示:

View Code

然后我们按照UnitPrice来查询,查询语句如下:

select * from OrderDetail2 where UnitPrice =5.70

其查询计划如下:

从上述查询计划我们可以看出,一个查询使用了两个索引。在idx_nc_UnitPrice上面是哦那个了Index Seek,而在PK_SalesOrderDetailId上面使用了Clustered Index Seek。

疑问二:mutilindex(name,age,tel)。对于mutilindex,若判别条件为(name),(name,age),(name,age,tel)都可以使用该索引,而(name,tel),(age,tel),(tel)都不能够使用该做引。

接下来我们创建一个复合索引包含SalesOrderID,CarrierTrackingNumber,UnitPrice这三个列,然后测试复合索引在什么情况下会被使用。创建复合索引的TSQL如下所示:

View Code

(1)然后我们将查询条件设定为复合索引的引导列,我们会发现:where条件是引导列,不论查询的是所有列或者是单列SalesOrderID,都使用了复合索引,而没有使用单列索引。TSQL查询如下所示:

View Code

查询计划如下图所示:

(2)如果查询条件是非引导列,那么将使用单列索引,而不使用复合索引,TSQL查询如下所示,执行计划在疑问一中已经给出。

View Code

(3)where查询条件包含了引导列,那么不论引导列在where条件的何处(多条件情况),都会使用复合索引。

View Code

查询计划如(1)所示。

(4)不包含引导列。假如where条件不包含引导列,那么将不会使用复合索引。比如执行如下TSQL查询,就没有使用复合索引,而是使用了两个单列各自的非聚集索引。这又是一个“一个查询可以使用多个索引”的例子。

select * from OrderDetail2 where CarrierTrackingNumber='48F0-4F3E-AE' and UnitPrice=1.374

上述查询的查询计划如下图所示:

总结:对于符合复合mutilindex(name,age,tel)。若判别条件为(name),(name,age),(name,tel),(name,age,tel)都可以使用该复合索引,而(age,tel),(tel)都不能够使用该做引。

 

 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/07/19/2599494.html,如需转载请自行联系原作者

你可能感兴趣的文章
C,C++开源项目中的100个Bugs
查看>>
linux创建进程和等待进程退出
查看>>
QT---系统托盘图标不显示原因
查看>>
[Unity3d][NGUI]两种思路解决AssetBundle的依赖关系.
查看>>
c中常用的关键字static const volatile
查看>>
格式化字符串攻击
查看>>
Nginx开启Gzip压缩大幅提高页面加载速度
查看>>
java的File类的 delete方法删不掉文件的原因分析
查看>>
Ubuntu下导入PySpark到Shell和Pycharm中(未整理)
查看>>
sqlHelper的增删改查
查看>>
附加到iis进程调试时找不到w3wp.exe
查看>>
java中的nextLine
查看>>
详解Javascript的继承实现(二)
查看>>
编程语言的进化
查看>>
iOS自己定义返回button(不影响返回手势)
查看>>
分布式系统常见的事务处理机制
查看>>
程序员是一个什么能力都可以发挥作用的平台
查看>>
hosts 不启作用的解决办法
查看>>
命令模式 Command 行为型 设计模式(十八)
查看>>
Django | QuerySet API reference | Django documentation
查看>>