
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で結果出力できることを前提にパフォーマンスを向上する方法を教えてください。
No.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秒
ご参照ください。
No.1
- 回答日時:
テーブルを2回結合してまでやりたい事が見えないので回答が的外れかもしれませんが…
・select句で「*」で抽出させるのをやめる。
(必要な項目は指定する)
・idにインデックスを張る。
このSQLで一番良いのは2回結合しない事ですが、やるとしたらこんな風にしか出来ないんじゃないでしょうか。
テーブル構成や各テーブル間の関係、テーブルから返ってくるデータ量によってパフォーマンスは変わるので一概にこれ!と言えるものはないと思いますよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Oracle SQL update方法 2 2022/06/22 14:07
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL、2つのテーブルで条件一致...
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
SQL 複数テーブルのupdate
-
テーブルやカラムの物理名のネ...
-
改行コードの検出方法につきまして
-
ROWNUMでUPDATEをしたいのです...
-
sqlplusで表示が変なので、出力...
-
update文で改行を入れる
-
SQLで違うテーブルの値を比較し...
-
Oracle(オラクル)で、日付時刻...
-
SQLの書き方を教えてください。
-
特定のカラムが更新されたとき...
-
Viewのカラムの長さが不明?
-
件数とデータを同時に取得する...
-
SQL(oracle)でご助言いただきた...
-
あるテーブルだけをキャッシュ...
-
データベースについて
-
テーブル名をカラムとして取得...
-
OracleのSQLで同テーブルのカラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL、2つのテーブルで条件一致...
-
テーブル名をカラムとして取得...
-
sqlplusで表示が変なので、出力...
-
update文で改行を入れる
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
SQL 複数テーブルのupdate
-
ROWNUMでUPDATEをしたいのです...
-
カラム位置変更
-
特定のカラムが更新されたとき...
-
数値をNUMBER型にするかCHAR型...
-
Oracleのview、synonymをCOMPIL...
-
DBからタブ区切りのCSVデータを...
-
件数とデータを同時に取得する...
-
OracleのSQLで同テーブルのカラ...
-
SQL(oracle)でご助言いただきた...
-
Viewのカラムの長さが不明?
-
SQLで違うテーブルの値を比較し...
-
DELETE文とロックについて
-
LONG型の先頭250バイトを Varch...
おすすめ情報