[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 メーリングリストの案内