- - PR -
複数の外部結合をした時の検索速度低下について
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文の変更のみで レスポンスを早くすることはできないでしょうか。 わかりにくい説明で申し訳ありませんがよろしくお願いいたします。 | ||||
|
投稿日時: 2006-03-02 16:34
まずは実行計画の内容を取得すること。どのようなインデックスが使われ、どのような手順で結合されているのかを確認する。それを元に最適化の余地がないか検討する。 「SQL文の変更だけで・・・」と言うのが、「スキーマを変更できない」という意味なら、ちょっと苦しいかもしれない。インデックスを追加とか、マテリアライズド・ビューを追加とか、効果の大きな方法は使えないって事ですよね。 ところで、もしかして、このテーブルって第一正規化すらしていないの? 正規化していないのに、結合で苦しむって・・・ | ||||
|
投稿日時: 2006-03-02 17:14
select句での相関サブクエリに書き換えれば早くなるかもしれません
| ||||
|
投稿日時: 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
