プロが教えるわが家の防犯対策術!

下のSQL文がパフォーマンスが非常に悪いです。
何かチューニングする方法ありませんか。

Oracle8.1.7 
OSはWin2000serverSP2

◇SQL文
SELECT A.HINCD , B.TANCD ,A.SIZE,A.COLOR
FROM TB_TBLA A ,TB_TBLB B
WHERE A.KA_CD = B.KA_CD(+)"
AND A.HINCD = B.HINCD(+)
AND A.JIGYOCD = 1
AND A.BRCD = 20
AND A.BUCD = 300

TB_TBLAの主キーは、JIGYOCD、BRCD、BUCDです。
TB_TBLBの主キーは、KA_CDです。

また、TB_TBLAの件数は、約10万件、TB_TBLBは3万件だとしたら、
読み込み件数は10万*3万件となるのでしょうか。

よろしくお願いします。

A 回答 (6件)

>"iniSID.ora”の中の”SORT_AREA_SIZE”を変更するような感じで色々書いてあるのですが、iniファイルには”SORT_AREA_SIZE”たる記述がありません。


初期化パラメータファイル(init.ora)にありませんか。
ただ初期化パラメータの「sort_area_size」を大きめに変更する場合、同時に「sort_area_retained_size」も変更しないと意味がないかと思います。

それと、init.oraを変更して、Oracleを再起動する野は大変ですよね。
ALTER SESSION SET SORT_AREA_SIZE=値;で設定していろいろ試してから変更するほうがらくだと思います。
    • good
    • 0
この回答へのお礼

いつもご回答ありがとうございます。

初期化パラメータの変更(init.ora)なんですね。
けど、今回、もう少し様子見することになりました。

いろいろありがとうございました。

実は、今回の件でパフォーマンス・チューニングに関して初めてかかわったのですが、かじりでも触れたかなと思っています。

また、よろしくお願いします。

お礼日時:2008/05/01 21:59

>ためしにヒントを入れてみたんですが、結果はさほど変わりませんでした。


/*+ FIRST_ROWS */で変わらないということは、それ以上早くならない可能性が大です。

SQLではなくオラクルの設定を見直したほうがいいと思います。
・共有プールのチューニング
・データベースバッファキャッシュのチューニング
・REDOログバッファのチューニング
・SGAのその他のチューニング
    • good
    • 1
この回答へのお礼

tomo316 いつもご回答ありがとうございます。

このSQL文で実行計画(autotrace)をとってみました。
するとソート読みしていることがわかり、テンポラリ領域まで使ってソートしていることがわかりました。

そこでデータをかなり削除してもらって、同じことをするとテンポラリ領域へのアクセスがかなり減りました。

お陰で無駄なデータもあったということもわかったのですが、メモリソート領域もデフォルトのままだったので、メモリソート領域を増やすことになりました。

ついでといっては申し訳ないのですが、そのメモリソート領域を動的ではなく、常に拡張するにはどのようにしたらいいのですか。
"iniSID.ora”の中の”SORT_AREA_SIZE”を変更するような感じで色々書いてあるのですが、iniファイルには”SORT_AREA_SIZE”たる記述がありません。
これは記述を追加するということなんでしょうか。

よろしくお願いします。

お礼日時:2008/04/24 10:41

/*+ ALL_ROWS */


SELECT /*+ ALL_ROWS */ A.HINCD , B.TANCD ,A.SIZE,A.COLOR
/*+ FIRST_ROWS */
SELECT /*+ FIRST_ROWS */ A.HINCD , B.TANCD ,A.SIZE,A.COLOR

10倍~100倍のレスポンスが違うよ。
    • good
    • 0
この回答へのお礼

tomo316さん、ありがとうございます。
ためしにヒントを入れてみたんですが、結果はさほど変わりませんでした。

お礼日時:2008/04/20 13:24

SELECT


A.HINCD,
(select B.TANCD from TB_TBLB B where A.KA_CD=B.KA_CD AND A.HINCD=B.HINCD),
A.SIZE,
A.COLOR
FROM TB_TBLA A
WHERE A.JIGYOCD=1 AND A.BRCD=20 AND A.BUCD=300
;

この回答への補足

ご回答ありがとうございます。
参考例で試したところ(timing取ったんですけど)、変化がみられませんでした。
timingは意味ないのでしょうか。

補足日時:2008/04/12 16:54
    • good
    • 0

/*+ RULE */を追加してみては。


SELECT /*+ RULE */ A.HINCD , B.TANCD ,A.SIZE,A.COLOR
こんな感じ。
あとは、マニュアルを読んでね。
・実行計画
・オプテマイザー
・ルール
・コスト
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Oracleに関してはほとんど経験がなく、これから色々勉強しなければいけないので、教えていただいた内容を探ってみます。

お礼日時:2008/04/08 23:11

我が家のPCには、oracle入れてないので、推測ですが・・・


このSQLではTB_TBLAでせっかくの主キーが使われてないと思います。

SELECT A.HINCD , B.TANCD ,A.SIZE,A.COLOR
FROM TB_TBLA A ,TB_TBLB B
WHERE A.KA_CD = B.KA_CD(+)"
AND A.HINCD = B.HINCD(+)
AND (A.JIGYOCD, A.BRCD, A.BUCD) = (1, 20, 300);

これで、主キーを使うようになると思います。
Oracleで、行比較ができなかったら、すみません。
    • good
    • 1
この回答へのお礼

ありがとうございます。
まだ、試してはいないので、これから試してみます。

お礼日時:2008/04/08 23:08

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