请在标记为重复之前阅读最后几段。
在 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 连接语法。
这个问题不是这个问题的重复,因为另一个问题是关于一个涉及超过 9 个表的非常复杂的查询,唯一的答案指出除了语法使用(主要是表的顺序)之外,查询非常不同。
在我的例子中,这是一个非常简单的查询,只是两个关系之间的连接,没有主要的差异复杂性,包括表的顺序。
- 这是 Oracle 9i 中的错误吗?
- 性能如此显着差异的原因是什么?
好吧,经过很长时间没有答案。我做了一些测试。
我在 10g 和 11g 中运行了相同的查询,这两个版本,使用 ANSI 连接的版本和使用 WHERE 连接的版本都在不到 1 秒的时间内运行。
由于问题只存在于 9i 中,相同的版本引入了对 ANSI 连接的支持,我认为这是 9i 中的一个错误,可以通过补丁解决也可以不解决。
令人高兴的是,正如我提到的,从 10g 开始,两种类型的联接都表现良好。