ハテナキハテナ --unics’s think/sync

福井のまんなかでぼんにょり呟く、ゆにくすの日々オボエガキなど。

実行計画の怪。

ただいまSQLの勉強中なのですが、なんとなくよーわからん現象が発生。

SELECT hoge.TIME, hoge.A, hoge.B
FROM hoge
WHERE hoge.TIME >= TO_DATE( :hogetime, 'YYYYMMDD' );
SELECT hoge.TIME, hoge.A, hoge.B
FROM hoge
WHERE hoge.TIME >= TO_DATE( '20080101', 'YYYYMMDD' );

(※hoge.TIMEはインデックス列です)
この2つのsql、TO_DATEの中身が変数であるかベタ打ちであるかの違いしかないのですが、実際実行してみて実行計画を見てみると、前者はINDEXが適用されてて後者はFULL ACCESSになります。
同僚に相談してみたところ、暗黙の型変換でもしてるんじゃないかとか、Oracleが「こっちのがいーじゃん」て勝手にやってるんじゃないかとか、そんな話が出てきたのですが…なんか釈然としない…(´・ω・`)
勉強用のテーブルは単純なものなので、コストもそんなにかからないっちゃかからないのですが、大規模なシステムになったときを考えると怖いですねぇ。ベタ打ちすんなってことかしら?うーん。
追記:
Cost-based Optimizerというものが働いているようです。以下、参考記事から抜粋。

CBOは、Cost-based Optimizerの略で、データ量など現在の環境状況の統計を勘案しながら最適なパフォーマンスを得られる方法で解釈して実行します。たとえば、データをマッチングする際には、一般的にはルールどおりインデックスを使うケースの方が速く処理できますが、件数が少ない場合では全件検索でメモリ上でマッチングした方が速くなる場合があります。

要するに、Oracleさんは世話焼き女房さんなわけですね。なんかちょっと萌えてきた(笑)。
http://www.oracle.co.jp/2shin/ora70/16_17.html

qqq for your reading!!
(c)Electro-U-nics --since 2004.03.26