请在标记为重复之前,请阅读最后几段.
在Oracle9i数据库中,此查询以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;...but这一个运行在一个可怕的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连接语法。
这些问题不是重复的 of this one,因为另一个问题是关于涉及9个以上表的一个非常复杂的查询,唯一的答案是,除了语法用法(主要是表的顺序)之外,查询是非常不同的。
在我的例子中,这是一个非常简单的查询,仅仅是两个关系之间的连接,没有市长复杂的差异,包括表的顺序。
更新:
这是执行计划,请注意,query的解释计划没有显示基数、成本或字节信息:
快速旧式连接:

Slow,ANSI连接:

发布于 2016-08-11 11:55:16
好吧,经过很长一段时间都没有答案。我做了些测试。
我在10g和11g中运行了相同的查询,这两个版本都是带有ANSI联接的,而具有WHERE联接的则在不到1秒的时间内运行。
由于问题只存在于9i中,对ANSI的支持与引入的版本相同,因此我假设是9i中的一个bug,它可以在补丁中解决,也可以不能解决。
正如我提到的,从10g开始,两种口味的连接都表现得很好。
https://stackoverflow.com/questions/33017069
复制相似问题