索引对查询效率的影响

简介:

0.参考文献

http://msdn.microsoft.com/zh-cn/library/ms172984(SQL.90).aspx

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

今天看到了博客园中的数据库查询性能优化之利器—索引(二),看着觉得有点不对劲,所以对文中的疑点进行测试。

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

参考:http://www.itpub.net/thread-1623492-1-1.html

首先我们准备实验数据,在这里我新建一张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,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
存储 关系型数据库 MySQL
MySQL索引失效及避免策略:优化查询性能的关键
MySQL索引失效及避免策略:优化查询性能的关键
212 3
|
6月前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
252 0
|
4月前
|
数据处理 数据库 索引
数据库索引策略如何影响数据的读取效率?
【7月更文挑战第3天】数据库索引策略如何影响数据的读取效率?
30 2
|
数据库 UED 索引
索引创建原则:提升数据库性能与查询效率的关键
在现代软件系统中,数据库是一个关键的组成部分,而索引作为提高数据库性能和查询效率的重要手段之一,其设计和创建的合理性直接影响着整个系统的稳定性和响应速度。本文将介绍索引的基本概念和原则,并详细探讨索引创建的几个关键原则,帮助读者了解如何为数据库中的表创建最优的索引,以提升系统性能。
177 0
|
存储 固态存储 测试技术
优化后,ES 做到了几十亿数据检索 3 秒返回!
优化后,ES 做到了几十亿数据检索 3 秒返回!
|
存储 机器学习/深度学习 缓存
|
存储 SQL 缓存
为什么索引可以让查询变快?终于有人说清楚了!
上表是一张真实的数据库表,其中每一行是一条记录,每条记录都有字段。假设上面的数据库是一个有10万条记录的大数据库。现在,我们想从10万条记录中搜索一些内容,那么挨着一个一个搜索无疑将花费很长的时间,这个时候我们在数据结构与算法里学的二分查找法就派上了用场。
为什么索引可以让查询变快?终于有人说清楚了!
|
Go 索引
维护索引——通过重组索引提高性能
原文:维护索引——通过重组索引提高性能 前言: 如果碎片程度小于30%,建议使用重组而不是重建。因为重组不会锁住数据页或者数据表,并且降低CPU的资源。 总得来说,重组会清空当前的B-TREE,特别是索引的叶子节点,重组数据页和消除碎片。
1075 0