ORACLE专栏

专注于ORACLE技术,本博客上的很多文章都是从网上摘抄来的,主要是方便自己学习之用....

not in , not exists 语句的N种写法

今天,发现production上有一个SQL 耗了特多CPU time,于是抓了下来,看看是否可以tuning .

原始 SQL 如下(table名字改了一下):

 

第一种变换(not in)  

现在来试一下变换

用not in 代替 not exists


在9i 里面,Oracle把这个语句和前面的语句看为同一个语句,当然执行计划和执行时间也没有差别。

 

第二种变换(minus)

第二种变换(minus)

用minus,

把 not exists 部分先用minus去掉,再用in 来选择data。

 


(minus + distinct )

在 minus之前加个 distinct看看

 


可以用 in ,当然就可以用 exists 或者join 了(delete不好用join,只好改为SELECT)

 


除了上面几种,还有一种不是很常用的方法
就是(outer join + is null )(也是为了方便,先用SELECT来演示,)



 


看来最后一种是最有效哦
改成DELETE形式看看

 


 

quote:
最初由 rollingpig 发布
在 9i 里面,in 和 exists已经基本一样,Oracle会在内部自动作转换

倒是 我提到的其中几个转换值的深究

1。in / exists ==> join

2。Add distinct in IN Clause or subquery

3. Add condition where rownum < 2 in exists clause (这个忘了演示了)

4, not exists / not in ==> outrt join + is null condition



甚至,可以反过来转换,有时候也有意想不到的效果。

某些时候

1。join ==> in / exists

2. 去掉某些distinct

3. outrt join + is null condition ==> not exists / not in

正确的应该是
outer join + is null condition

 


阅读更多
个人分类: ORACLE
上一篇ORACLE 中ROWNUM用法总结
下一篇NVL函数的使用
想对作者说点什么? 我来说一句

Android Listener侦听的N种写法

2012年04月23日 58KB 下载

SQL 九九乘法表

2012年06月04日 3KB 下载

没有更多推荐了,返回首页

关闭
关闭