关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »关于or与in能不能利用索引的探讨

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

    2010-04-13 10:02:00 出处:ITJS
    分享

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

    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语句的执行计划。

    SELECT *   FROM Employees   WHERE (EmployeeID IN (2, 4, 5))   SELECT *   FROM Employees   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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。