電子書籍の厳選無料作品が豊富!

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で結果出力できることを前提にパフォーマンスを向上する方法を教えてください。

A 回答 (2件)

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秒

ご参照ください。
    • good
    • 0

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



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

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


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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!