我的编程空间,编程开发者的网络收藏夹
学习永远不晚

sql中in与exist效率是怎么样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

sql中in与exist效率是怎么样的

这篇文章将为大家详细讲解有关sql中in与exist效率是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、IN 与EXISTS
1、理解

IN的执行流程
SELECT * FROM T1 WHERE X IN (SELECT Y FROM T2)
事实上可以理解为:
SELECT * FROM T1, (SELECT DISTINCT Y FROM T2) T2 WHERE T1.X =T2.Y
从这里可以看出,IN需要先处理T2表,然后再和T1进行关联

EXISTS的执行流程

SELECT *FROM T1 WHEREEXISTS (SELECT
NULLFROM T2 WHEREY = X)--可以理解为:for xin (select
* fromt1 ) LOOP    if( exists ( selectnull
from t2where y =x.x )THEN        OUTPUTTHE RECORD    endifend loop

从这里看出,EXISXTS会先查询T1表,然后再LOOP处理T2表

2、结论
对于in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了。
综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

二、NOT IN 与NOT EXISTS
1、理解

NOT IN的执行流程
SELECT * FROM T1 WHERE X NOT IN (SELECT Y FROM T2)
事实上可以理解为:
SELECT * FROM T1, (SELECT DISTINCT Y FROM T2) T2 WHERE T1.X !=T2.Y

NOT EXISTS的执行流程

SELECT .. ...  FROMROLLUP R WHERE NOTEXISTS (SELECT'Found'
FROM
TITLE TWHERE R.SOURCE_ID = T.TITLE_ID);--可以理解为:for xin (select
* fromrollup )       loop           if(
not exists ( that query ) ) then                  OUTPUT           endif;        end;

注意:NOT EXISTS 与 NOT IN不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。具体见:in/exists和notin/not exists语意探讨

2、结论
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用notin,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hashjoin.如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用或者外连接+isnull.一般情况下建议使用not exists

--比如:SELECT .. ....  FROMROLLUP R WHERE NOTEXISTS (SELECT'Found'
FROM
TITLE TWHERE R.SOURCE_ID = T.TITLE_ID);--改成SELECT .. ....  FROMTITLE T, ROLLUP
R WHERE R.SOURCE_ID =T.TITLE_ID(+)   ANDT.TITLE_ID
IS
NULL;--或者SELECT.... ..  FROMROLLUP R WHERE OURCE_IDNOT
IN
       (SELECTOURCE_ID
FROM TITLE TWHERE OURCE_ID
IS
NOT NULL);

关于“sql中in与exist效率是怎么样的”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

sql中in与exist效率是怎么样的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中提高代码效率技巧是怎么样的

这篇文章将为大家详细讲解有关Python中提高代码效率技巧是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。对象相等。您认为type(a) == type(b)和type(a) is
2023-06-17

MsgPack和JSON在Redis序列化中的效率怎么样

在Redis中,MsgPack比JSON更高效。MsgPack是一种二进制数据格式,相比于JSON的文本格式,MsgPack更加紧凑和高效。这意味着在将数据序列化成MsgPack格式存储到Redis时,占用的空间会更小,同时在数据解析和操作
MsgPack和JSON在Redis序列化中的效率怎么样
2024-04-29

Qt5.14与OpenCV4.5中图片的增强效果是怎样的

这篇文章给大家介绍Qt5.14与OpenCV4.5中图片的增强效果是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、建立Qt工程1、选择类别2、建立项目名称3、选择Qt基类及修改名称4、选择编译器(这边两个都选
2023-06-21

Java中BufferedReader与Scanner读入的区别是怎么样的

今天就跟大家聊聊有关Java中BufferedReader与Scanner读入的区别是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。java.util.Scanner类是一个
2023-06-25

Win10核心思想是速度与效率 学会怎么听取用户的意见反馈

微软一直以来都对 Windows 10 寄予了厚望,因此投入了大量的人力物力来悉心打造它。虽然现在看来android Windows 10 还存在许多缺陷,但是微软相信这将是他们目前推出最好的一款系统,至少在速度和性能方面要大大优于其前任,
2023-06-12

Linux中显示内存和CPU使用率最高的进程是怎么样的及SHELL脚本怎么编写

本篇文章为大家展示了Linux中显示内存和CPU使用率最高的进程是怎么样的及SHELL脚本怎么编写,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。显示CPU占用率最高的十个进程信息# ps aux|
2023-06-05

编程热搜

目录