2009-08-20 53 views
2

编辑9-3-10:我最近发现这个博客条目非常有启发性。 http://optimizermagic.blogspot.com/2007/12/outerjoins-in-oracle.htmlOracle外连接 - 性能

有时候,其中一个或另一个连接语法可能实际上表现更好。我还发现,当选择ANSI连接语法时,有一点注意到性能略有提高(仅在VLDB中可见)。可能不足以让人烦恼,但对于那些认真掌握Oracle DB的人来说,查看文章可能会有帮助。


我知道两个外连接语法对于Oracle:(假设我的第二个样本正确的语法)

select a, b 
from table1 
left outer join table2 
on table2.foo = table1.foo 

OR

select a, b 
from table1, table2 
where table2.foo(+) = table1.foo 

这些性能有差异吗?起初,我认为它只是开发人员的一种风格偏好,但后来我读了一些让我觉得可能会使用一种风格而不是另一种风格的理由。

+1

(+)进入非ANSI连接的WHERE子句。 – 2009-08-20 20:31:46

+0

谢谢 - 可能很明显,我从不使用旧的Oracle方式。我来自SQL Server世界。我会纠正它。 – user158017 2009-08-21 00:58:24

回答

4

“也许会有一个理由使用 一种风格,而不是其他的”

是有原因的,但与性能无关。 ANSI风格的外部联接以及标准联接提供了FULL OUTER JOIN和外部联接到多个表。

+0

感谢您的额外信息。我更喜欢使用标准的想法,但一些培训材料被列为议题“培训何时使用传统Oracle连接而不是ANSI连接”。这让我感到惊讶。听起来像坚持ANSI连接可能仍然更有意义,为便携性和灵活性,如果没有别的。 – user158017 2009-08-21 01:01:57

1

没有性能差异。您还可以检查两个查询的执行计划以进行比较。

1

理论上,第二个查询执行两个表的笛卡尔积,然后选择满足连接条件的笛卡尔积。但实际上,数据库引擎会优化它与第一个完全相同。

2

Oracle不支持版本9i之前的ANSI语法。

自该版本以来,这些查询做同样的并产生相同的计划。

正确的预9i语法是这样的:

SELECT a, b 
FROM table1, table2 
WHERE table2.foo(+) = table1.foo 
0

我在回答我自己的问题时发现了一些额外的信息。看起来旧的风格非常有限,就像3年前的这篇文章一样。

http://www.freelists.org/post/oracle-l/should-one-use-ANSI-join-syntax-when-writing-an-Oracle-application,2

我想也许只会是有意义的使用旧的风格,如果由于某种原因,查询可能对甲骨文的一个过时的版本上运行。

我在工作中看到的东西几乎都是旧式的,但可能仅仅是因为顾问从9i开始就一直在Oracle工作,他们可能没有看到更新所有旧东西的理由。

谢谢大家!

0

这是不一样的。在第一种情况下,你强迫按照该顺序加入表格。 在第二种情况下,Oracle Planner可以选择执行查询的最佳选项。

在这个微不足道的情况下,结果可能在所有执行过程中都是一样的,但是如果在更复杂的情况下使用sintax,则会显示差异。

+1

您是说传统的Oracle连接语法更好,因为优化器可以更自由地工作?你有文档显示加入ANSI语法强制执行命令吗?当我在SQL Server中工作时,我曾经认为它的确如此,但到目前为止,在Oracle中,我没有看到我的命令如何处理,除非添加某种“提示”。这是一个有趣的想法,但我会进一步追求。 – user158017 2009-09-29 23:25:53