请在标记为重复之前,阅读最后几段。
在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张以上的表,而唯一的答案指出,除了语法用法(主要是表的顺序)之外,查询是非常不同的。
在我的案例中,这是一个非常简单的查询,仅仅是两个关系之间的连接,没有任何复杂的差异,包括表的顺序。
更新一下。
这是执行计划 请注意,查询一的解释计划没有显示基数、成本或字节信息 :
好了,在长时间没有答案的情况下。我做了一些测试。
我在10g和11g中运行了同样的查询,两个版本中,使用ANSI连接的版本和使用WHERE连接的版本都在1秒之内运行。
由于问题只存在于9i中,我猜测是在9i版本中引入了对ANSI连接的支持。这是9i的一个错误 可以或不可以在补丁中解决的问题。
可喜的是,正如我所提到的,从10g开始,两种口味的加入都表现良好。