プロが教える店舗&オフィスのセキュリティ対策術

現在PL/SQL内にてSELECTを発行しています。
環境はoracle 11g、WinServer2008です。

SQLは下記になります。

SELECT
*
FROM
TABLE_VIEW TV1
WHERE
DAY_F <= kijun_dt AND
DAYT >= kijun_dt ;

kijun_dtは変数で渡しています。

質問は、kijun_dtを変数で渡すと処理が5秒くらいかかってしまうのですが
'2012/03/01'のように固定すると一瞬で返ってきます。

型は日付型できちんとわたっており、
他のテーブル(view)でも同じように変数で渡している箇所が
あるのですが、結果は一瞬え返ってきます。

統計情報の更新、マテリアライズド・ビューを作成し使用などしてみましたが
どうしても遅くなる原因が特定できません。

似たような現象になった、または何か情報をお持ちの方、
ご回答を宜しくお願い致します。

足りない情報等御座いましたら書ける範囲で出しますので
よろしくおねがいします。

A 回答 (2件)

#1さんに加えて。



統計情報があるため、固定値のリテラルではインデックスが効いて、バインド変数ではフルスキャンしている、などが考えられます。
(その日付項目のカーディナリティにより、逆の結果になる事もある)

また、件数の増減が激しいテーブルであれば、統計情報取得タイミングも考えないとダメでしょう。

リテラル版とバインド版で、それぞれトレースを取り、実行計画を比較してください。

施策の一つとしてはリテラル版に近い実行計画になるようなオプティマイザヒントを付与する事です。

トレースやオプティマイザヒントに関しては、OTNでパフォーマンスチューニング関係のマニュアルがダウンロードできるので、そちらを参考に。

実施環境が本番なのか、テスト環境なのか、も考慮する必要があります。
テスト環境で遅くても本番では速いかもしれないし、逆もまた然り。
    • good
    • 0

とっさに思いつくのは



・テーブル側の型と変数の型が一致していない
・TABLE_VIEWの構造が複雑
・ここに書いていない条件がある
・テーブルのサイズ(列・行ともに)がおっきい

かな
    • good
    • 0

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