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

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

解決済みの質問

Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパ

Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパフォーマンス向上

Oracleで1つのSQL内で同じテーブルを2回以上結合すると結果出力にかかる時間が非常に遅くなります。
例: SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id
(テーブルBを2回結合している)

こういう場合にパフォーマンスを落とさない方法はありますか?テンポラリテーブルでテーブルBのレプリカを作成して使用するというのはなしです。あくまで1つのSQLで結果出力できることを前提にパフォーマンスを向上する方法を教えてください。

投稿日時 - 2010-05-27 02:04:48

QNo.5924761

暇なときに回答ください

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

SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id
ここの「テーブルBを2回結合している」-> 意味ない。
->
SELECT * FROM A, B b1 WHERE a.id = b1.id → 結果件数同じです。

実行時間テスト。
テーブルA/Bのデータ件数=10000件

******* VISUAL SQLTOOLS - Log ************
14:38:04:890 SQL: SELECT * FROM TEST_TABLE , TEST_TABLE1 b1 , TEST_TABLE1 b2 WHERE TEST_TABLE.id = b1.id AND TEST_TABLE.id = b2.id
->: 10000 件 0.562秒

14:38:05:546 SQL: SELECT * FROM TEST_TABLE , TEST_TABLE1 b1 WHERE TEST_TABLE.id = b1.id
->: 10000 件 0.390秒

14:38:05:984 SQL: SELECT TEST_TABLE.ID FROM TEST_TABLE , TEST_TABLE1 b1 , TEST_TABLE1 b2 WHERE TEST_TABLE.id = b1.id AND TEST_TABLE.id = b2.id
->: 10000 件 0.078秒

14:38:06:125 SQL: SELECT TEST_TABLE.ID FROM TEST_TABLE , TEST_TABLE1 b1 WHERE TEST_TABLE.id = b1.id
->: 10000 件 0.062秒

ご参照ください。

投稿日時 - 2010-05-27 15:59:54

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

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

回答(2)

テーブルを2回結合してまでやりたい事が見えないので回答が的外れかもしれませんが…

・select句で「*」で抽出させるのをやめる。
(必要な項目は指定する)

・idにインデックスを張る。


このSQLで一番良いのは2回結合しない事ですが、やるとしたらこんな風にしか出来ないんじゃないでしょうか。

テーブル構成や各テーブル間の関係、テーブルから返ってくるデータ量によってパフォーマンスは変わるので一概にこれ!と言えるものはないと思いますよ。

投稿日時 - 2010-05-27 14:20:35

あなたにオススメの質問