[Seasar-user:20267] Re: [DBFlute]OracleでDATE型カラムのインデックスが利用されない
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2010年 10月 21日 (木) 19:30:15 JST
小林 (koichik) です.
Date: Thu, 21 Oct 2010 18:29:47 +0900
From: kubo <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:20265] Re: [DBFlute]OracleでDATE型カラムのインデックスが利用されない
> java.sql.Date を利用することで、ある意味、
> 「時分秒は考慮しなくていいよ」っていうヒントに
> なって、速くなるんですね。
そっちですかねぇ?
java.sql.Date -> Oracle の DATE 型扱い
java.sql.Timestamp -> Oracle の TIMESTAMP 型扱い
ということで、java.sql.Timestamp を使うと
DATE のカラムと TIMESTAMP のバインド変数の比較となり、
それは DATE を TIMESTAMP に変換して行われるので、
インデックスがうまく使われなかったりするのでは
ないかなぁと思ったり。
もしそうだとすると、
> 検索条件に設定された java.util.Date が時分秒を
> 持っていない場合に限り setDate() の方を利用する
>
> っていう処理を入れるとフィットするのかもですね。
しゃってんさんの場合はたまたま DATE 型のカラムが
日付のみなのでそれでもよさげですが、日付と時刻を
持つ DATE 型のカラムの場合に遅くなるのは
避けられないように思います。
Oracle JDBC ドライバには oracle.sql.DATE という
型があるので、java.sql.Timestamp からこの型に
変換して、OraclePreparedStatement#setDATE() に
渡すなんてのが Oracle 的に好ましいやり方なのかも。
しゃってんさん:
以下のケースも試してみてください。
import oracle.sql.DATE;
import oracle.jdbc.OraclePreparedStatement;
java.util.Date date = ...;
PreparedStatement ps = ...;
((OraclePreparedStatement) ps).setDATE(index, new DATE(date));
...
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
<property name="twitter">"http://twitter.com/koichik"</property>
</component>
Seasar-user メーリングリストの案内