请在标记为重复之前阅读最后几段。
在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个表的非常复杂的查询,唯一的答案指出查询非常不同除了语法用法(主要是表的顺序)。
在我的情况下,这是一个极其简单的查询,仅仅是两个关系之间的联合,没有市长的差异,包括表格的顺序。
更新
这是执行计划,注意到查询一的解释计划没有显示基数,成本或字节信息:
答案 0 :(得分:2)
我在10g和11g以及两个版本中运行相同的查询,一个使用ANSI连接,另一个使用WHERE连接,运行时间不到1秒。
由于问题仅存在于9i中,同样的版本支持ANSI加入引入的地方我假设这是9i 中的一个错误,可能或者可能无法在补丁中解决。
正如我所提到的,从10g开始,两种口味的连接都表现良好。