oracle IN与EXISTS子查询的关系

转自:https://blog.csdn.net/suyishuai/article/details/18362679

在我任职的公司里面,有很多的规范啊手册一类的东西。我们公司oracle语法规范里面有2条我一直就很怀疑(1.子查询结果集小,用IN 2.外表小,子查询表大,用EXISTS),我前几天看了一些文章说每个版本的oracle的CBO有一些的不同,我想试验下,刚才的2条规则。由于我手上只有10G和11G的环境,我只能给大家演示这2个版本的。

   


   

   通过上面的例子,我发现一般情况下的子查询,用in和extsis在oracle 10G里面执行计划是一样的。接着试验11G

   

   

   哈哈!用in和extsis在oracle 11G里面执行计划也是一样的。

   但是ORACLE优化器还是有限制的,无法UNNEST的限制如子查询有CONNECT BY,SET操作,ROWNUM,关联子查询内部包含分组函数等。还比如SEMI JOIN.ANTI JOIN条件带OR的形式等。这时候,我们常用的优化方式就是SQL的等价改写,这要根据具体的业务和数据特点,来重写等价的SQL。比如下面的SQL。

   

   

   所以有时候,大家写完SQL后,要看看执行计划的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值