论坛首页 综合技术论坛

in 和 exists的区别 用数据说话

浏览 41171 次
该帖已经被评为良好帖
作者 正文
   发表时间:2012-06-01  
我泼一盆冷水哦!
其实吧。
我觉得oracle 升级到10g,11g之后,这两个使用方法区别其实不大了。
就像8i以前中的where中判断字段的前后位置还能影响到SQL性能。
我觉得一楼主可以去研究一下oracle的优化器。这种靠SQL的拼写决定性能的路子,我觉得不对。
0 请登录后投票
   发表时间:2012-06-01  
mikixiyou 写道
我泼一盆冷水哦!
其实吧。
我觉得oracle 升级到10g,11g之后,这两个使用方法区别其实不大了。
就像8i以前中的where中判断字段的前后位置还能影响到SQL性能。
我觉得一楼主可以去研究一下oracle的优化器。这种靠SQL的拼写决定性能的路子,我觉得不对。

嗯,我写测试用例来说明sql的执行不是我们说了算,而是执行计划!不同的sql可能得到的执行计划是一样的!因此我们不要随意猜测,一切以执行计划为准!以不变应万变!
0 请登录后投票
   发表时间:2012-06-01   最后修改:2012-06-01
jinnianshilongnian 写道
mikixiyou 写道
我泼一盆冷水哦!
其实吧。
我觉得oracle 升级到10g,11g之后,这两个使用方法区别其实不大了。
就像8i以前中的where中判断字段的前后位置还能影响到SQL性能。
我觉得一楼主可以去研究一下oracle的优化器。这种靠SQL的拼写决定性能的路子,我觉得不对。

嗯,我写测试用例来说明sql的执行不是我们说了算,而是执行计划!不同的sql可能得到的执行计划是一样的!因此我们不要随意猜测,一切以执行计划为准!以不变应万变!


也就是说,你的测试数据并不是为了得出exists和in什么情况谁效率高的规律?我觉得题目应该换成in和exists的执行计划研究。。。题目说"exists 和 in的区别",结论是不能把in和exists作对比,一切看执行计划。。。确实题目让人有点误会。。。

之前部门有个培训,要求我们一定不能用in,in尽可能改成exists。虽然自己对这句话很不满,但是由于地位低下,以及确实不确定exists和in具体怎么被oracle解析,所以只能照着老人明确指示的"规矩"来做。。。
0 请登录后投票
   发表时间:2012-06-04  
liguocai2009 写道
jinnianshilongnian 写道
mikixiyou 写道
我泼一盆冷水哦!
其实吧。
我觉得oracle 升级到10g,11g之后,这两个使用方法区别其实不大了。
就像8i以前中的where中判断字段的前后位置还能影响到SQL性能。
我觉得一楼主可以去研究一下oracle的优化器。这种靠SQL的拼写决定性能的路子,我觉得不对。

嗯,我写测试用例来说明sql的执行不是我们说了算,而是执行计划!不同的sql可能得到的执行计划是一样的!因此我们不要随意猜测,一切以执行计划为准!以不变应万变!


也就是说,你的测试数据并不是为了得出exists和in什么情况谁效率高的规律?我觉得题目应该换成in和exists的执行计划研究。。。题目说"exists 和 in的区别",结论是不能把in和exists作对比,一切看执行计划。。。确实题目让人有点误会。。。

之前部门有个培训,要求我们一定不能用in,in尽可能改成exists。虽然自己对这句话很不满,但是由于地位低下,以及确实不确定exists和in具体怎么被oracle解析,所以只能照着老人明确指示的"规矩"来做。。。


我一直用in
0 请登录后投票
   发表时间:2012-06-04  
学习了,不过用10g测试了结果与lz很多都不一样,10g做了蛮多优化

比如 例2 不会再有中间表生成了。

而且 not in 会使用索引

not in 会采用 NESTED LOOPS ANTI(反向嵌套循环) 

0 请登录后投票
   发表时间:2012-06-25  
11g下,Oracle会自动帮你优化in exists了(自动转换)
当然是简单的in exists语句
就是说在11g下,这两个在简单的sql中没区别了
0 请登录后投票
   发表时间:2012-08-04  
IN 隐藏着排序,小心点特别在子查询当中
0 请登录后投票
   发表时间:2012-09-06  
楼主辛苦了 好帖啊
0 请登录后投票
   发表时间:2012-11-23  
本人非常看好此贴。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics