みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

表の結合(性能)

2つのテーブルを(内部)結合させる場合、
INNER JOINによる結合と
WHERE句に結合条件を記述する2通りの方法が
あると思いますが、どちらが早いのでしょうか?

なお、Oracle9i、ルールベースにて構築されています。
テーブルの内容、SQL文は下記のとおりです。

ご教授よろしくお願いします。

■表 A
項目A-1 ・・・PRIMARY KEY1、INDEX1
項目A-2 ・・・PRIMARY KEY2、INDEX2
項目A-3 ・・・PRIMARY KEY3
項目A-4

■表 B
項目B-1 ・・・PRIMARY KEY1、INDEX1
項目B-2 ・・・PRIMARY KEY2、INDEX2
項目B-3 ・・・PRIMARY KEY3
項目B-4

※項目A-1と項目B-1にて結合。
 項目A-2が"01"と等しいレコード。

表Aのレコード件数>表Bのレコード件数


【WHERE句にて結合】
SELECT * FROM A,B
where A.項目1 = B.項目1
and A.項目2 = '01'

【INNER JOINにて結合】
SELECT * FROM A
INNER JOIN A
ON A.項目1 = B.項目1
AND A.項目2 = '01'

投稿日時 - 2005-04-21 18:52:09

QNo.1344206

すぐに回答ほしいです

質問者が選んだベストアンサー

表定義の見方がよくわかりませんが、PRIMARY KEYを3つのカラムに設定している時点でインデックスは死んでしまっているような気がするのですが。

結合方法をWHERE句に記述してもINNER JOINを使用しても実行計画が変わることはないようです。

ただし、LEFT JOIN, RIGHT JOINを使用した場合は強制的にコストベースになるので注意が必要です。

また、FROM句でA, Bの順に記述されていますが、A.項目2 = '01'の条件で絞り込んでも、まだ

Aの件数 > Bの件数が成り立つのでしょうか?

もし、これで逆転するようなら、A.項目2にインデックスを作成し、FROM句をB, Aとした方が性能がよくなるように思われます。

ちなみに、ご存知かも知れませんが、ルールベースがサポートされているのは9iまでで、10gからは完全に廃止されています。

投稿日時 - 2005-04-22 09:58:50

お礼

お礼が遅くなって申し訳ありません。
ご指摘ありがとうございました。

投稿日時 - 2005-04-25 10:56:10

ANo.3

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

GoF

オプティマイザは、マイナーバージョンでも変更されると聞きますし、
COMPATIBLE 初期パラメータでも、変動します。
どちらが高速かは、わかりませんが。
(+)演算子の未来も暗そうなので、WHEREで結合条件を書くのは控えて
INNER JOIN で書いていった方が将来明るいと思います。

どうしても調べたいならば、TRACEすれば個別のケースでは優劣は付くかもしれませんが
それで、100%の正解にはならないと思います。

あと、#2さんの指摘に加えて、
どのようなパターンだとしても(複合でも単独でも)、インデックスが冗長のように見えます。

投稿日時 - 2005-04-21 22:51:01

お礼

お礼が遅くなって申し訳ありません。
ご指摘ありがとうございました。

投稿日時 - 2005-04-25 10:54:57

説明に出てくる”PRIMARY KEY1”、”PRIMARY KEY2”の意味がわかりません。
複数項目で設定したプライマリキーの第一項目、第二項目の意味でしょうか?
INDEX1,INDEX2も不明ですが..

【WHERE句にて結合】と【INNER JOINにて結合】の違いは、
従来型の記述か、ANSI構文かの違いなので、
それによる速度差は無いのではないかと思いますが、
実行計画を見ないと確かなことは言えません。

投稿日時 - 2005-04-21 21:03:26

お礼

お礼が遅くなって申し訳ありません。
ご指摘ありがとうございました。

投稿日時 - 2005-04-25 10:54:25

あなたにオススメの質問