本文主要分析了in和exists的区别与执行效率的问题:
in可以分为三类:
1、形如select * from t1 where f1 in ( 'a ', 'b '),应该和以下两种比较效率。
select * from t1 where f1= 'a ' or f1= 'b ' |
或者
select * from t1 where f1 = 'a ' union all select * from t1 f1= 'b ' |
你可能指的不是这一类,这里不做讨论。
2、形如
select * from t1 where f1 in (select f1 from t2 where t2.fx= 'x '), |
其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。
3、形如
select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx), |
其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。
除了第一类in语句都是可以转化成exists 语句的,一般编程习惯应该是用exists而不用in.
A,B两个表,
(1)当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:
select * from A where id in (select id from B) |
(2)当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:
select * from A where exists (select 1 from B where id = A.id and col1 = A.col1 |
0
收藏
推荐专栏更多
猜你喜欢
我的友情链接
js闭包的研究
Java线程:线程的调度-休眠
我们不得不面对的中年职场危机
职场终极密籍--记我的职业生涯
用光影魔术手制作一寸照片(8张一寸)
我的IT职场生涯: 毕业4年,月薪过万
Linux关闭休眠和屏保模式
年薪从0到10万-我的IT职场经验总结
Windows7删除休眠文件hiberfil.sys节省大量C盘空间
致IT同仁 — IT人士常犯的17个职场错误
“跳槽加薪”现象,无奈的职场规则
PostgreSQL的B-tree索引
PostgreSQL pg_rewind实例--could not find previous WA
redis geo 地理位置系应用战案例
PostgreSQL逻辑备份pg_dump使用及其原理解析
PostgreSQL如何删除不使用的xlog文件
PostgreSQL pg_ctl start超时分析
Greenplum -- segment 死机后恢复
postgresql 主备及切换-恢复方案


扫一扫,领取大礼包
转载于:https://blog.51cto.com/77857/157747
Ctrl+Enter 发布
发布
取消