Oracle 9i 中 ANSI 连接性能不佳的原因
Reason for poor performance of ANSI joins in Oracle 9i
请在标记为重复之前阅读最后一段。
在 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 中的错误吗?
- 造成如此巨大性能差异的原因是什么?
更新:
这是执行计划,注意查询一的解释计划没有显示基数、成本或字节信息 :
快速的旧式连接:
慢,ANSI 连接:
好吧,很久没有答案了。我做了一些测试。
我 运行 在 10g 和 11g 以及两个版本中使用相同的查询,使用 ANSI 连接的查询和使用 WHERE 连接的查询 运行 不到 1 秒。
由于问题只存在于 9i 中,相同的版本引入了对 ANSI 连接的支持我假设这是 9i 中的一个错误,可以通过补丁解决也可以不解决.
很高兴,正如我提到的,从 10g 开始,两种类型的连接都表现良好。
请在标记为重复之前阅读最后一段。
在 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 中的错误吗?
- 造成如此巨大性能差异的原因是什么?
更新:
这是执行计划,注意查询一的解释计划没有显示基数、成本或字节信息 :
快速的旧式连接:
好吧,很久没有答案了。我做了一些测试。
我 运行 在 10g 和 11g 以及两个版本中使用相同的查询,使用 ANSI 连接的查询和使用 WHERE 连接的查询 运行 不到 1 秒。
由于问题只存在于 9i 中,相同的版本引入了对 ANSI 连接的支持我假设这是 9i 中的一个错误,可以通过补丁解决也可以不解决.
很高兴,正如我提到的,从 10g 开始,两种类型的连接都表现良好。