- PR -

複数の外部結合をした時の検索速度低下について

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/03/02
投稿数: 1
投稿日時: 2006-03-02 16:23
はじめて投稿をします。よろしくお願いします。

環境:Oracle10g 10.2.0

状況:複数の外部結合をしたSELECT文の処理速度が遅い。

使用テーブル:
TrnTBL メインテーブル
┣Trn_CD 主キー
┣MEM_CD1 メンバーコード1
┣MEM_CD2 メンバーコード2
┣MEM_CD3 メンバーコード3


┗MEM_CD25 メンバーコード25
(INDEXはTrn_CD)

MstMEM メンバーマスタ
┣MEM_CD メンバーコード
┗MEM_NM メンバー名
(INDEXはMEM_CD)

TrnTBLとMstMEMの結合条件:
TrnTBL.MEM_CDn = MstMEM.MEM_CD

必要な結果:
TrnTBLを主としたTrnTBLレコード全件の各メンバー名

発行SQL:
SELECT TrnTBL.Trn_CD
   ,MstMEM1.MEM_NM MEM_NM1
   ,MstMEM2.MEM_NM MEM_NM2
   ・
   ・
   ,MstMEM25.MEM_NM MEM_NM25
FROM TrnTBL
LEFT OUTER JOIN MstMEM MstMEM1
 ON TrnTBL.MEM_CD1 = MstMEM1.MEM_CD
LEFT OUTER JOIN MstMEM MstMEM2
 ON TrnTBL.MEM_CD2 = MstMEM2.MEM_CD


LEFT OUTER JOIN MstMEM MstMEM25
 ON TrnTBL.MEM_CD25 = MstMEM25.MEM_CD

このような状況なのですが、SQL文の変更のみで
レスポンスを早くすることはできないでしょうか。

わかりにくい説明で申し訳ありませんがよろしくお願いいたします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-03-02 16:34
引用:

未記入さんの書き込み (2006-03-02 16:23) より:
はじめて投稿をします。よろしくお願いします。
状況:複数の外部結合をしたSELECT文の処理速度が遅い。


まずは実行計画の内容を取得すること。どのようなインデックスが使われ、どのような手順で結合されているのかを確認する。それを元に最適化の余地がないか検討する。

「SQL文の変更だけで・・・」と言うのが、「スキーマを変更できない」という意味なら、ちょっと苦しいかもしれない。インデックスを追加とか、マテリアライズド・ビューを追加とか、効果の大きな方法は使えないって事ですよね。

ところで、もしかして、このテーブルって第一正規化すらしていないの?
正規化していないのに、結合で苦しむって・・・
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2006-03-02 17:14
select句での相関サブクエリに書き換えれば早くなるかもしれません
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-03-03 15:58
似たようなケースで、以下のようにしたら高速になったことがあります。
この場合だと、カラムが25あるので、焼け石に水かもしれませんが...

LEFT OUTER JOIN MstMEM MstMEM1
の MstMEM を
( SELECT -9999 AS MEM_CD, NULL AS MEM_NM FROM DUAL UNION ALL SELECT * FROM MstMEM )
として、LEFT OUTER JOIN を INNER JOIN にして、
 ON TrnTBL.MEM_CD1 = MstMEM1.MEM_CD
の TrnTBL.MEM_CD1 を NVL( TrnTBL.MEM_CD1, -9999 ) にします。

TrnTBL.MEM_CD1 の属性が、CHARなどの場合、-9999ではなくて、'#NULL#'などの
固定値にします。

1

スキルアップ/キャリアアップ(JOB@IT)