2009-08-20 33 views
2

EDIT 9-3-10:最近このブログエントリが見つかりました。これは非常に啓発的でした。 http://optimizermagic.blogspot.com/2007/12/outerjoins-in-oracle.htmlOracle外部結合 - パフォーマンス

実際には、1つまたは他の結合構文が優れている場合があります。また、ANSIよりもOracle結合構文を選択したときに、わずかなパフォーマンスの向上(VLDBでのみ顕著)が発生していることがわかりました。たぶん十分な情報は得られないかもしれませんが、Oracle DBをマスターすることについて真剣に取り組んでいる人にとっては、その記事をレビューすることが役立ちます。


私は2つの外側の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 

(。私は第2サンプル右の構文を得たと仮定した場合)

これらの間にパフォーマンスの違いはありますか?最初は私はそれが開発者のスタイルの好みに過ぎないと思っていましたが、それから私はもう一つのスタイルを使う理由があると思うかもしれない何かを読んでいました。

+1

(+)は、非ANSI結合のWHERE句に入ります。 –

+0

ありがとうございます - おそらく明らかなように、私は古いオラクルの方法を使用しません。私はSQL Serverの世界から来た。私はそれを修正します。追加情報ありがとうございました。 – user158017

答えて

4

理由がありますが、パフォーマンス関連のものではありません。 ANSIスタイルの外部結合は、標準と同様に、FULL OUTER JOINと外部結合を複数の表に提供します。

+0

私は標準を使用するという考え方を好むが、ANSIジョインの代わりに従来のOracleジョインを使用するタイミングを訓練するアジェンダ・トピックとしてリストアップされたトレーニング・マテリアルを好む。それは私に不思議に思った。 ANSI結合に固執するような音は、おそらく、他に何もない場合には移植性と柔軟性のためにおそらくもっと理にかなっています。 – user158017

1

パフォーマンスの違いはありません。比較する両方のクエリの実行計画を確認することもできます。

1

理論的には、2番目のクエリは2つのテーブルのデカルト積を実行し、次に結合条件を満たすものを選択します。しかし実際には、データベースエンジンは最初のものとまったく同じように最適化します。

2

Oracle9iより前の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

私は、おそらくそれだけでいくつかの理由でのクエリは、Oracleの古いバージョンで実行される可能性がある場合は、古いスタイルを使用するように理にかなって思います。

ほとんどのものは古いスタイルですが、コンサルタントが9i以前からOracleで作業していて、古いものをすべて更新する理由がないと考えられます。

ありがとうございます!

0

これは同じではありません。最初のケースでは、順番にテーブルに参加する必要があります。 2番目のケースでは、Oracle Plannerは問合せを実行する最適なオプションを選択できます。

この単純なケースでは、結果はおそらくすべての実行で同じになりますが、より複雑なケースでそのsintaxを使用するとその差異が表示されます。

+1

オプティマイザがより自由に作業できるため、従来のOracle結合構文が優れていると言いますか? ANSI構文を使用して結合すると順序が強制されることを示す文書がありますか?私はSQL Serverで作業していると思っていましたが、Oracleではこれまでのところ、「ヒント」を追加しない限り、物事をどのように順序付けするかはわかりません。これは興味深い考えですが、私はそれをさらに追求します。 – user158017