love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

10g中distinct加强以及anti jion,semi jion

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 10g中distinct加强以及anti jion,semi jion

我们可以看到此时逻辑读之和为671,没有排序消耗。下面修改一个隐含参数继续比较:

我们发现,此时虽然逻辑读是一样的,但是多了1个memory的排序操作,可见10.2里面跟以前版本
在distinct 排序操作上有更进一步的优化了。

我们继续来看上面的执行计划,发现是HASH JOIN RIGHT ANTI,也就是anti jion。
我们知道oracle 在处理exist和in时,是使用的semi jion,然而在处理not exists和not in时
是用的anti jion,下面我来验证一下:

可以看到此时是semi jion了。

下面来测试下not in的情况:

可以看到这里非常奇怪,居然走filter了。

可以看到,目前走hash jion了,问兔子,他是这样说的:
not in如果没有约束或语句避免null问题,内部会使用lnnvl函数,11g有null aware优化,
比10g好点,因此not in写法特别注意null,lnnvl是undocument函数.

所以我这里将自动owner修改为not null,下面来看看11g中是不是这样的,我这里以11gR2为例:
——10.2.0.5

——-11.2.0.2

可以看到11g中,即使object_id字段默认允许为空,sql仍然可以走hash anti jion,
而不是去像10g一样走filter。 这里的NA表示null aware.

2 Responses to “10g中distinct加强以及anti jion,semi jion”

  1. 西瓜 Says:

    “我们知道oracle 在处理exist和in时,是使用的anti jion,然而在处理not exists和not in时是用的semi jion” 
    这句写反了 🙂

  2. roger Says:

    笔误,已更正,3Q!

Leave a Reply

You must be logged in to post a comment.