• ベストアンサー

外部結合のパフォーマンスチューニングできますか

下の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万件となるのでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • tomo316
  • ベストアンサー率35% (51/142)
回答No.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=値;で設定していろいろ試してから変更するほうがらくだと思います。

kuriosprj
質問者

お礼

いつもご回答ありがとうございます。 初期化パラメータの変更(init.ora)なんですね。 けど、今回、もう少し様子見することになりました。 いろいろありがとうございました。 実は、今回の件でパフォーマンス・チューニングに関して初めてかかわったのですが、かじりでも触れたかなと思っています。 また、よろしくお願いします。

その他の回答 (5)

  • tomo316
  • ベストアンサー率35% (51/142)
回答No.5

>ためしにヒントを入れてみたんですが、結果はさほど変わりませんでした。 /*+ FIRST_ROWS */で変わらないということは、それ以上早くならない可能性が大です。 SQLではなくオラクルの設定を見直したほうがいいと思います。 ・共有プールのチューニング ・データベースバッファキャッシュのチューニング ・REDOログバッファのチューニング ・SGAのその他のチューニング

kuriosprj
質問者

お礼

tomo316 いつもご回答ありがとうございます。 このSQL文で実行計画(autotrace)をとってみました。 するとソート読みしていることがわかり、テンポラリ領域まで使ってソートしていることがわかりました。 そこでデータをかなり削除してもらって、同じことをするとテンポラリ領域へのアクセスがかなり減りました。 お陰で無駄なデータもあったということもわかったのですが、メモリソート領域もデフォルトのままだったので、メモリソート領域を増やすことになりました。 ついでといっては申し訳ないのですが、そのメモリソート領域を動的ではなく、常に拡張するにはどのようにしたらいいのですか。 "iniSID.ora”の中の”SORT_AREA_SIZE”を変更するような感じで色々書いてあるのですが、iniファイルには”SORT_AREA_SIZE”たる記述がありません。 これは記述を追加するということなんでしょうか。 よろしくお願いします。

  • tomo316
  • ベストアンサー率35% (51/142)
回答No.4

/*+ 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倍のレスポンスが違うよ。

kuriosprj
質問者

お礼

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

回答No.3

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 ;

kuriosprj
質問者

補足

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

  • tomo316
  • ベストアンサー率35% (51/142)
回答No.2

/*+ RULE */を追加してみては。 SELECT /*+ RULE */ A.HINCD , B.TANCD ,A.SIZE,A.COLOR こんな感じ。 あとは、マニュアルを読んでね。 ・実行計画 ・オプテマイザー ・ルール ・コスト

kuriosprj
質問者

お礼

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

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.1

我が家の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で、行比較ができなかったら、すみません。

kuriosprj
質問者

お礼

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

関連するQ&A