Oracle 9i 中 ANSI 连接性能不佳的原因

Reason for poor performance of ANSI joins in Oracle 9i

请在标记为重复之前阅读最后一段。

在 Oracle 9i 数据库中,此查询在 0.18 秒内运行:

select
    count(*)
from 
    dba_synonyms s,dba_objects t
where
    s.TABLE_OWNER = t.OWNER(+) and
    s.TABLE_NAME = t.OBJECT_NAME(+) and
    s.DB_LINK is null and
    t.OWNER is null;

...但是这个运行时间令人震惊 120 秒!:

select
    count(*)
from 
    dba_synonyms s left join dba_objects t 
                   on ( s.TABLE_OWNER = t.OWNER and s.TABLE_NAME = t.OBJECT_NAME ) 
where                   
    s.DB_LINK is null and
    t.OWNER is null;

请注意,唯一的区别是使用专有的 Oracle 连接语法与 ANSI 连接语法。

这些问题不是 this one 的重复,因为另一个问题是关于涉及超过 9 个表的非常复杂的查询,唯一的答案指出除了语法用法(主要是表的顺序)之外,查询非常不同。

在我的例子中,这是一个非常简单的查询,只是两个关系之间的连接,没有主要的差异复杂性,包括表的顺序。

更新:

这是执行计划,注意查询一的解释计划没有显示基数、成本或字节信息 :

快速的旧式连接: 慢,ANSI 连接:

好吧,很久没有答案了。我做了一些测试。

我 运行 在 10g 和 11g 以及两个版本中使用相同的查询,使用 ANSI 连接的查询和使用 WHERE 连接的查询 运行 不到 1 秒。

由于问题只存在于 9i 中,相同的版本引入了对 ANSI 连接的支持我假设这是 9i 中的一个错误,可以通过补丁解决也可以不解决.

很高兴,正如我提到的,从 10g 开始,两种类型的连接都表现良好。