Oracle外连接 - 性能

时间:2009-08-20 20:14:40

标签: sql oracle plsql

编辑9-3-10:我最近发现此博客文章非常具有启发性。 http://optimizermagic.blogspot.com/2007/12/outerjoins-in-oracle.html

有时,一个或另一个连接语法实际上可能表现更好。我还发现,在选择ANSI连接语法而不是ANSI连接语法时,已经注意到性能略有提高(仅在VLDB中显着)。可能还不够挑剔,但对于那些认真掌握Oracle数据库的人来说,查看这篇文章可能会有所帮助。


我知道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

(假设我得到了第二个样本的语法。)

这些之间是否存在性能差异?起初我认为它必须只是开发人员的风格偏好,但后来我读到的东西让我觉得可能有理由使用一种风格而不是另一种风格。

6 个答案:

答案 0 :(得分:4)

  

“也许有理由使用   一种风格而不是另一种风格。 “

有原因,但与性能无关。 ANSI样式外连接以及标准外连接为多个表提供FULL OUTER JOIN和外连接。

答案 1 :(得分:2)

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

从该版本开始,这些查询会执行相同的操作并生成相同的计划。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我在回答自己的问题时找到了一些额外的信息。看起来旧样式非常有限,就像3年前的这份文档一样。

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

我认为,如果出于某种原因,查询可能会在过时的Oracle版本上运行,那么使用旧样式也许才有意义。

我在工作中看到的东西几乎都是旧式的,但这可能只是因为顾问在9i之前一直在Oracle工作,他们可能没有理由去更新所有旧东西。< / p>

全部谢谢!

答案 5 :(得分:0)

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

在这个简单的情况下,结果可能在所有执行中都是相同的,但如果你在更复杂的情况下使用sintax,则会显示差异。