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

时间:2015-10-08 13:19:35

标签: performance join syntax oracle9i ansi-sql

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

在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个表的非常复杂的查询,唯一的答案指出查询非常不同除了语法用法(主要是表的顺序)。

在我的情况下,这是一个极其简单的查询,仅仅是两个关系之间的联合,没有市长的差异,包括表格的顺序。

  • 这是Oracle 9i中的错误吗?
  • 性能如此显着差异的原因是什么?

更新

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

快速,旧式联接: enter image description here 慢,ANSI加入: enter image description here

1 个答案:

答案 0 :(得分:2)

好吧,经过很长一段时间没有答案。我做了一些测试。

我在10g和11g以及两个版本中运行相同的查询,一个使用ANSI连接,另一个使用WHERE连接,运行时间不到1秒。

由于问题仅存在于9i中,同样的版本支持ANSI加入引入的地方我假设这是9i 中的一个错误,可能或者可能无法在补丁中解决。

正如我所提到的,从10g开始,两种口味的连接都表现良好。