oracle优化器缺陷(三)

本篇文章的主要详细展开的是优化器外连接转内连接的内容,外连接转连接其实是很多数据库都有的功能,当sql的某些外连接写法满足内连接语义时就会进行转换。

oracle应该很早就拥有了这个功能好像是11.1版本,由参数_optimizer_outer_join_to_inner控制。默认为true,也可以通过hint OUTER_JOIN_TO_INNER/NO_OUTER_JOIN_TO_INNER来控制。

如sql:

该sql从语义看就可以转换成内连接,oracle确实也是这样做的,执行计划并未出现left/right join,并且outline写了OUTER_JOIN_TO_INNER(@”SEL$2BFA4EE4″ “T2″@”SEL$1”)

但是当使用函数时,则无法转成内连接,如:

其实从语义上来说也是可以转换的,这个在国产数据库vastbase中就可以完成转换。

vastbase:

可以看到即使使用了函数substr,vastbase也可以进行内连接转换。只要是strict的函数,都可以转换。如果不是strict的函数,比如nvl函数表达式,不满足如果参数为空,输出必定为空的就不能转换。这样才是合理的。

外连接转内连接的好处:

以left join为例,如果where谓词作用于右表,并且没有(+)时,可以通过转换成内连接使得nestloop的驱动表为右表。如果是left join,nestloop的驱动表不可能为右表(同样如果是rightjoin,那么nestloop的驱动表不能为左表)。当然hash join是可以的,oracle有参数_right_outer_hash_enable控制。

综上所述好处则是,当满足转换内连接语义时,并且右表返回记录很少,非常适合nestloop驱动表时,外连接转内连接就会有很大提升。

此条目发表在Oracle, Oralce performance分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注