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

问题描述 投票:1回答:1

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

在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中的一个bug吗?
  • 是什么原因导致了如此巨大的性能差异?

更新一下。

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

快速,老式加入。enter image description here慢速,ANSI连接。enter image description here

performance join syntax oracle9i ansi-sql
1个回答
2
投票

好了,在长时间没有答案的情况下。我做了一些测试。

我在10g和11g中运行了同样的查询,两个版本中,使用ANSI连接的版本和使用WHERE连接的版本都在1秒之内运行。

由于问题只存在于9i中,我猜测是在9i版本中引入了对ANSI连接的支持。这是9i的一个错误 可以或不可以在补丁中解决的问题。

可喜的是,正如我所提到的,从10g开始,两种口味的加入都表现良好。

© www.soinside.com 2019 - 2024. All rights reserved.