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

解決済みの質問

VIEWのレスポンス改善について

現在オラクル10gでレスポンス改善の勉強をしています。
下記のようなデータ、テーブルがあるとき有効なSQLの書き方が分かりません。
テーブル名;MASTER_CODE
カラム名
・区分コード
・コード
・レベル
・名称

サンプルデータ
区分コード、コード、レベル、名称
1000 10 1 東京本部
1000 11 1 大阪支店
1000 12 1 福岡支店
1000 10 2 営業部 
1000 11 2 開発部
1000 12 2 総務部
1000 10 3 1課
1000 11 3 2課
1000 12 3 3課
1100 10 1 A商事
1100 11 1 B商事
1100 12 1 C商事
1100 10 2 A商事の住所
1100 11 2 B商事の住所
1100 12 2 C商事の住所

テーブル名;TRAN_TABLE
カラム名
・連番
・支店コード
・部署コード
・課コード
・得意先コード
・得意先住所コード

サンプルデータ
連番、支店コード、部署コード、課コード、得意先コード、得意先住所コード

1 10 12 10 10 10
2 11 11 12 11 11
3 12 10 11 12 12

上記のようなテーブルがあり
トランザクショテーブルからマスタを参照し、
コードではなく名称で取得できるVIEWを作成しました。
select * from
TRAN_TABLE A,
(select コード、名称 from MASTER_CODE where 区分=1000 AND レベル=1) SHITEN,
(select コード、名称 from MASTER_CODE where 区分=1000 AND レベル=2) BUSHO,
(select コード、名称 from MASTER_CODE where 区分=1000 AND レベル=3) KA,
(select コード、名称 from MASTER_CODE where 区分=1100 AND レベル=1) TORIHIKISAKI,
(select コード、名称 from MASTER_CODE where 区分=1100 AND レベル=2) TORIJUSHO
WHERE
SHITEN.コード(+)=A.支店コード AND
BUSHO.コード(+)=A.部署コード AND
KA.コード(+)=A.課コード AND
TORIHIKISAKI.コード(+)=A.得意先コード AND
TORIJUSHO.コード(+)=A.得意先住所コード 
上記のSQLだとレスポンスがよくありません。
(実際はマスターテーブルに多くのデータを登録してあります)

同じMASTER_CODEを使用しているので、もっと良い方法があるのでしょうか?

ご回答宜しくお願いします。

投稿日時 - 2009-01-27 21:35:17

QNo.4666539

困ってます

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

このSQL内容であれば、以下のようにスカラー副問い合わせ(SELECT文の中に入っている、単行を返すSELECT文)を使うのがベストだと思います。また、もしマスタに「区分+レベル+コード」のインデックスがなければ追加してください。
スカラー副問い合わせはマスタから名称を取るような場合に最適な方法のため、元SQLがうまく最適化されていれば同等のパフォーマンスとなる可能性もありますが、良くなることはあっても悪くなることはない書き方になります。(今回の場合。)
厳密な比較のためには、元SQLと実行計画やSQLトレースを比較してみてください。
(インデックスのほうが原因という可能性もありますね。)
------------------------------------------------------------------
select
A.連番
, A.支店コード
, A.部署コード
, A.課コード
, A.得意先コード
, A.得意先住所コード
, (select 名称 from MASTER_CODE where 区分=1000 AND レベル=1 AND コード = A.支店コード) AS "支店名"
, (select 名称 from MASTER_CODE where 区分=1000 AND レベル=2 AND コード = A.部署コード) AS "部署名"
, (select 名称 from MASTER_CODE where 区分=1000 AND レベル=3 AND コード = A.課コード) AS "課名"
, (select 名称 from MASTER_CODE where 区分=1100 AND レベル=1 AND コード = A.得意先コード) AS "得意先名"
, (select 名称 from MASTER_CODE where 区分=1100 AND レベル=2 AND コード = A.得意先住所コード) AS "得意先住所"
from
TRAN_TABLE A
;

投稿日時 - 2009-01-27 22:53:15

お礼

早急な回答ありがとうございました。
本日、試してみました。
かなりのレスポンス改善があり、驚きました。
質問内容では、1組の例を記載していましたが
実際は上のようなVIEWをさらに5個結合させていましたので
15倍から30倍の速さのレスポンスになりました。
SQL文もシンプルになり助かりました。
ありがとうございました。

投稿日時 - 2009-01-28 20:45:35

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

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

回答(1)

あなたにオススメの質問