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

締切り済みの質問

PL/SQL内の検索条件について

現在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)でも同じように変数で渡している箇所が
あるのですが、結果は一瞬え返ってきます。

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

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

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

投稿日時 - 2012-03-22 10:25:21

QNo.7376738

すぐに回答ほしいです

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

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

回答(2)

ANo.2

#1さんに加えて。

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

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

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

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

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

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

投稿日時 - 2012-03-22 12:01:59

ANo.1

とっさに思いつくのは

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

かな

投稿日時 - 2012-03-22 11:57:25

あなたにオススメの質問