[Seasar-user:20255] Re: [DBFlute]OracleでDATE型カラムのインデックスが利用されない

kubo [E-MAIL ADDRESS DELETED]
2010年 10月 20日 (水) 20:40:28 JST


久保です。

> お手数ですが、JDBC直接利用でPreparedStatementの
> setDate() を使った場合と、setTimestamp() を使った場合で、
> インデックス利用に差がでるかどうか確認して頂けないでしょうか?
> 上記の理論的には、setDate() でインデックスが利用されて、
> setTimestamp() では利用されないはずです。

その前に、もっと簡単な方法があるかも。

> DBFluteConfig のコンストラクタにて、TnValueTypes に対して、
> UTILDATE_AS_TIMESTAMP を設定している箇所があるかと思います。

この処理をコメントアウトして試してみて下さい。
DBFluteのデフォルトは、java.util.Date を java.sql.Date に
マッピングしてJDBCに設定しますので、DateFromToOptionを
修正しなくてもインデックスの利用有無が変わるかも。

2010/10/20 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保です。
>
> しゃってんさん、こんばんは
>
>> 回避策として、DateFromToOption の filterFromDate 及び filterToDate
>> をオーバーライドし返却する値を java.sql.Date 型にすることで
>> ファンクションの型変換が行われず、意図したインデックスを利用することができました。
>
> まず、DBFluteの内部処理の整理ですが、
> JDBCには java.util.Date のインターフェースはないので、
> java.sql.Date、java.sql.Timestamp どちらかにマッピングします。
> OracleのDate型は、時分秒を持っているため、厳密には
> java.sql.Date には対応しないので、プロパティの java.util.Date は、
> java.sql.Timestamp として扱われます。
> ご利用のDBFluteが最新バージョンではないようですが、
> 最近のバージョンなので違いはないと思います。
> DBFluteConfig のコンストラクタにて、TnValueTypes に対して、
> UTILDATE_AS_TIMESTAMP を設定している箇所があるかと思います。
>
> そこで、現象を素直に捉えると:
> java.sql.Timestamp => インデックスが利用されない。
> java.sql.Date => インデックスが利用される。
>
> お手数ですが、JDBC直接利用でPreparedStatementの
> setDate() を使った場合と、setTimestamp() を使った場合で、
> インデックス利用に差がでるかどうか確認して頂けないでしょうか?
> 上記の理論的には、setDate() でインデックスが利用されて、
> setTimestamp() では利用されないはずです。
>
> とりあえず、このことが明確になってからどうするか
> 考えたいと思います。ojdbc6 になってから、メタデータで
> Date型がTypes.TIMESTAMPにマッピングされるように
> なったので、setTimestamp() が正しいかなと思いきや...
>
> 2010/10/20 しゃってん <[E-MAIL ADDRESS DELETED]>:
>> しゃってん と申します。
>>
>> 下記条件でSQLを実行した際に意図したインデックス(日付型カラムに付与したインデックス)が利用されませんでした。
>> 回避策は見つけているため合わせて報告いたします。
>>
>> 環境
>> ・Oracle 11gR2
>> ・Java 6
>> ・ojdbc-6
>> ・S2Framework 2.4.41
>> ・DBFlute 0.9.7.1
>>
>> テーブル情報
>> ・日付型(DATE型)カラムにインデックスを付与
>> ・検索条件で日付の From To を指定
>>
>> 実行条件
>> ・ConditionBeanでSQLを組み立てて実行
>>  ex) cb.query().setTargetDate_FromTo(fromDate,toDate,new DateFromToOption());
>>
>>
>> データ件数が少ない場合はインデックスの利用有無に関わらず応答があったため気にならなかったのですが、
>> 大量データ(数百万件以上)のデータを登録した際に応答が悪くなったため調査をいたしました。
>>
>> 実行計画を確認したところ、SQL実行時に検索条件の日付がOracleのファンクションによって型変換がおこなわれるために
>> インデックスが利用されないといった状況になっておりました。
>>
>> 回避策として、DateFromToOption の filterFromDate 及び filterToDate
>> をオーバーライドし返却する値を java.sql.Date 型にすることで
>> ファンクションの型変換が行われず、意図したインデックスを利用することができました。
>>
>> DB型がDATEの場合にSQLのパラメータを組み立てる際、自動的にjava.sql.Dateへの変換は行えないでしょうか?
>> (回避策があるため、緊急性はありません。)
>>
>> 以上、検討をお願いいたします。
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>
>


Seasar-user メーリングリストの案内