2009-08-20 55 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