oracle IN与EXISTS子查询的关系

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

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

   oracle IN与EXISTS子查询的关系


   oracle IN与EXISTS子查询的关系

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

   oracle IN与EXISTS子查询的关系

   oracle IN与EXISTS子查询的关系

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

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

   oracle IN与EXISTS子查询的关系

   oracle IN与EXISTS子查询的关系

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