ORACLE 中IN和EXISTS比较
select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
对于in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
另外IN时不对NULL进行处理
如:
select 1 from dual where null in (0,1,2,null)
为空
2.NOT IN 与NOT EXISTS:
NOT EXISTS的执行流程
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);
可以理解为:
for x in ( select * from rollup )
loop
if ( not exists ( that query ) ) then
OUTPUT
end if;
end;
注意:NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。
例如下面语句,看他们的区别:
select x,y from t;
x y
------ ------
1 3
3 1
1 2
1 1
3 1
5
select * from t where x not in (select y from t t2 )
no rows
select * from t where not exists (select null from t t2
where t2.y=t.x )
x y
------ ------
5 NULL
所以要具体需求来决定
对于not in 和 not exists的性能区别:
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join.
如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null
NOT IN 在基于成本的应用中较好
比如:
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);
改成(佳)
select ......
from title T, rollup R
where R.source_id = T.Title_id(+)
and T.Title_id is null;
或者(佳)
sql> select /*+ HASH_AJ */ ...
from rollup R
where ource_id NOT IN ( select ource_id
from title T
where ource_id IS NOT NULL )
注意:上面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法
希望大家提出异议
转载于:https://www.cnblogs.com/yf520gn/archive/2009/01/12/1374359.html
ORACLE 中IN和EXISTS比较相关推荐
- oracle中sql函数exists,sql的exits函数
oracle的exits函数 select t.fene from fenebiao t where t.code = '001' and date = to_date('2017-07-17', ' ...
- oracle中in与exists,Oracle中in和exists的区别
项目中对数据库的查询操作很多,各种拼接,各种in,但由于in的内容受字符限制,所以有些地方将in改成了Extist,两种写法有什么关联,查了写资料,分析看看: in和exists in 是把外表和内表 ...
- oracle有没有mysql if_Oracle中没有 if exists(...)
对于Oracle中没有 if exists(...) 的语法,目前有许多种解决方法,这里先分析常用的三种,推荐使用最后一种 第一种是最常用的,判断count(*)的是否为零,如下 declare v_ ...
- oracle中sql语句的优化(转帖)
一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边 表或视图: Student_info (30000条数据) Description_inf ...
- oracle百分比变成小数,oracle中计算百分比,并同时解决小数点前0不显示的问题...
select a.catalog_name,decode(substr(trunc((a.s/b.count2),4)*100||'%',0,1),'.',replace(trunc((a.s/b.c ...
- oracle中sql语句的优化
2019独角兽企业重金招聘Python工程师标准>>> 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边 表或视图: St ...
- oracle中的exists 和 not exists 用法详解
from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...
- Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別
Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別 通常聽到的都是說盡量用exists不要用in,因為exists只判斷存在而in需要對比值,所以exists比較快, ...
- oracle中exist什么意思,oracle中not exists 是什么意思 , oracle数据库中exists的作用
导航:网站首页 > oracle中not exists 是什么意思 , oracle数据库中exists的作用 oracle中not exists 是什么意思 , oracle数据库中exist ...
最新文章
- 工信部王卫明:我国5G研发开局良好
- B. 熟练剖分(tree) (概率DP)
- Java实现复数Complex的加减乘除运算、取模、求幅角角度
- SCCM 2012远程控制
- 乐视网1354项商标1.3亿元成交,接盘的是这家公司
- python2升级_Python2 升级 Python3
- python selenium框架搭建_python + selenium 自动化框架搭建
- Unity中内嵌网页插件 UniWebView 2.8使用
- EasyRecovery15版本电脑数据恢复软件
- 8.声卡驱动05-自己实现alsa驱动-虚拟声卡-kcontrol
- 平面设计之PS(前)
- 手把手教你做出数据可视化项目(三)3D地球旋转
- Windows​服务器添加单IP不同段IP和整段IP
- 代码可读性为什么重要啊....人家读不出来不是更安全吗?
- python 城市身份证代号
- 第二章 z变换之四 、序列的z变换与连续时间信号的Laplace变换、Fourier变换的关系
- E/KING_CARD: WebSettingsExtension getQProxyEnabled false
- VisionMobile:“只为粉丝”或者小米并非你所想的那样
- 算法书籍推荐及网络资源
- 交换control和command按键
热门文章
- GDAL源码剖析(一)
- Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress
- 【java学习之路】(java SE篇)002.java SE基础语法
- html弹幕效果加入视频,JS实现的视频弹幕效果示例
- php global没用,global php 不起作用怎么办
- linux 修改jdk版本 /usr/src/jdk-11.0.11/bin/java: 无法执行二进制文件
- springboot集成mybati 后又使用mybatisPlus 出现的问题 BindingException:Invalid bound statement
- CentOs7配置java环境
- HIve map jion的原理、操作和使用场景
- Linux 下 WildFly (原Jboss) 的安装 、配置以及发布