关于or与in能不能利用索引的探讨

数据库 SQL Server 数据库运维
本文将讨论的是or与in能不能利用索引,这关乎数据库的效能问题。作者的研究平台基于SQL Server 2000。

说说数据库方面的事情。在网上看到了几种说法,我们一起来分析一下说的到底对不对,是不是准确的,有没有歧义,会不会误导大家。

1、 or会引起全表扫面。

2、 in会引起全表扫描。

3、 in会引起全表扫描,并且和or等效。

4、 or语句使用不当会引起全表扫描。

为了避免一些误会,同时也是缩小讨论范围,所以先解释一个名词和说一下前提条件。名词解释:全表扫描在数据库中,对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。 引自:http://baike.baidu.com/view/2010124.htm?fr=ala0_1_1

前提条件

数据库:SQL Server2000 + sp4 (注意:一定要安装sp4补丁包,如果未安装任何补丁包可能执行计划会和安装sp4的不一致)

其他数据库没有研究,所以在这里就不讨论了。

好了,名词解释和前提条件都说好了,我们开始讨论吧。

第四个说法是我用google搜索出来的,说的很明确。or“使用不当”才会引起全表扫描,那么使用得当的话,显然是可以避免全表扫描的。文章的例子也说的很明确。http://www.zbitedu.com/?action-viewthread-tid-39219

在这里不得不赞扬一下google的强大,google搜索出来的结构都是明确的,而且可以把明确的排在***位。而baidu就不管三七二十一,管你对不对、是否明确,全都收录进来,然后你自己去分析、思考吧。Bs baidu 一下。

而前三总说法就很不明确,和算命先生的那句话有的一拼。即没有明确的说“一定”会引起全表扫描,也没有说有没有例外,含含糊糊,极易误导人。试问:您有没有下意识的加上了一个定语“一定”(or一定会引起全表扫描)呢?如果您没有加上“一定”这个定语的话,那么您有没有想过是否有反例?

如果没有反例的话,那么就加上“一定”就是正确的,那么原话为什么不加上?

如果有反例的话,那么原话就完全没有交代清楚。 

所以有没有反例,这就是一个很不明确,很误导人的地方。

当然了——in和or是等效的——这句话我是认同的。in和or确实是等效的,数据库会把in转换成or的形式。

开始分析

以一个Northwind数据库的Employees表 为例(这是SQL Server2000里自带的数据库),分析几种SQL语句的执行计划。

  1. SELECT *   
  2. FROM Employees   
  3. WHERE (EmployeeID IN (2, 4, 5))   
  4. SELECT *   
  5. FROM Employees   
  6. WHERE EmployeeID = 2 or EmployeeID =  4 or EmployeeID =  5  

这两个SQL语句的执行结果是一致的,执行计划也是一致的。我们来看看EmployeeID字段在有无索引,有什么类型的索引的情况下,执行计划都是什么样子的

1、 EmployeeID不是主键(没有聚集索引和非聚集索引)

  主键索引

从执行计划里可以明确的看出来,在没有索引的情况下,确实引起了全表扫描。(请不要着急下结论,还有两种情况没有看呢。)

2、 是主键(聚集索引)  

当是主键,并且是聚集索引的情况下,执行计划发生了变化,避免了全表扫描。

3、 不是主键,但是设置了非聚集索引

非聚焦索引

这回执行计划又发生了变化,不过依然没有引起全表扫描,只是增加了一个步骤(使用标签)

本来想看看只有主键,但是主键字段不设置索引(聚集和非聚集)的情况下,执行计划是什么样子的,但是发现一个小问题,我不知道怎么让设置成主键的字段没有任何索引?企业管理器里是把主键和聚集索引强行绑定到一起了,把一个字段设置成主键,同时也把聚集索引设置给了这个字段。目前我是没发现怎么把这个主键的索引给去掉。也许应该用SQL语句的方式给表设置主键吧。这个就先不研究了。

总结:in和or会不会引起全表扫描?根据情况而定。即根据是否能够利用索引而定。

原文标题:为or、in平反——or、in到底能不能利用索引?

链接:http://www.cnblogs.com/jyk/archive/2010/04/10/1708945.html

【编辑推荐】

  1. Oracle数据库索引的优点与缺点的描述
  2. Oracle数据对象中的索引与视图的描述
  3. 理解SQL Server 2008索引的存储结构
  4. Oracle索引如何提高数据库的查询效率
  5. Oracle数据库索引的优点与缺点的描述

 

责任编辑:彭凡 来源: 博客园
相关推荐

2019-11-21 09:25:23

AI 数据人工智能

2013-04-19 10:42:02

打车软件大数据

2016-05-19 17:10:27

银行

2021-02-26 21:25:08

比特币投资货币

2022-10-20 08:00:37

机器人ZadigChatOps

2020-10-16 18:33:18

Rust语言前端开发

2020-12-21 15:09:23

人工智能安全人脸识别

2023-12-27 08:03:53

Go优化代码

2024-04-26 09:37:43

国产数据库开发者

2022-04-24 11:52:04

元宇宙Web3去中心化

2023-04-06 06:55:24

ChatGPTGPT算力

2012-06-13 11:01:59

英特尔

2012-05-02 23:24:59

RIM

2022-11-07 08:36:11

2022-12-09 08:22:26

Gradle编译运行

2021-06-15 11:33:48

监控微信聊天前端

2011-12-06 10:06:33

云存储

2009-07-16 22:39:11

2018-03-05 07:38:11

2020-12-03 07:39:50

HashMap底层数据
点赞
收藏

51CTO技术栈公众号