- - PR -
SQLで、DATE型のカラムよりCHAR型のカラムの方が検索が早いのですか?
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2007-06-12 19:44
2007年06月12日(火)
疑問。 あるデータベースで、日付を格納するカラムをCHAR型の8文字(20070612って感じ)に格納していました。 その理由を聞いてみると、「そっちの方が検索が早かった」と言うのです。 その方曰く、「インデックス張ったけど、段違いだったよ」との事。 私としては、日付や時刻はやはりDATE型を使うべきだと思うのです。 なぜなら、日付や時刻を格納するために作られているのですから、必ずメリットがあるはずだと思うのです。 しかし、テスト用の環境が自由に扱えない上、知識不足のため「どうしてCHAR型が早くなったのか」「DATE型は本当に遅いのか」という検証がおこなえないのです。 どなたか、以下の質問にお答えいただけないでしょうか。 ・CAHR型で日付・時刻を表すと検索する時に早くなるのか? ・それはどういう状況で起きるのか? ・DATE型のカラムで検索を行う際に、早くする方法はあるのか?(索引の種類等) 私自身はこんな実例を始めて見ましたし、困惑しているというのが正直な所です。 どんな資料を見ればいいのかもよく解りません。 DBはOracle10gです。 JavaのコードからJDBCを通じてアクセスしています。 SQLの記述は、単純にSQL文をString型変数に格納してStatementで実行しています。 以上です。 どうか宜しくお願いします。 |
|
投稿日時: 2007-06-12 23:46
ORACLEはあまり詳しくありませんが、
遅いのは画面より入力された日付(時刻指定は無し)で検索するために 関数を使っていたのではないでしょうか? 例) WHERE TO_CHAR(日付型列, 'YYYYMMDD') = 入力値 ※入力値はYYYYMMDD形式 といった具合に、これだとインデックスはききません。 WHERE 日付型列 BETWEEN TO_DATE(入力値) AND TO_DATE(入力値 + 23:59:59) ※入力値はYYYY-MM-DD形式 とすればインデックスは効くでしょうが、双方が文字列の場合の 等号検索には及びません。 またBETWEENを使ってしまうと複数インデックスがある場合の マージ検索を行ってくれなかったかと記憶しています。 入力値が時刻まで指定されていれば日付型で何の問題ないと思いますが、 検索する項目値が日付+時刻が格納されている日付型で入力値が日付指定のみだと、 日付という『線』と時刻という『点』を比較する必要があるため パフォーマンス的に不利になるケースがあるかと思います。 逆にVARCHAR型等にしておくと、Likeで高速に該当月のデータを抽出できたりもして むしろメリットが多いです。 参考HP:http://itpro.nikkeibp.co.jp/article/COLUMN/20060309/232077/ そもそも日付時刻データを指定日付で高速に検索したいという ごくあたりまえの与件を無視しているという点で、 多くのDBMSには実装に欠陥があるといえるかもしれません。 [ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2007-06-13 00:38 ] |
|
投稿日時: 2007-06-13 13:24
オラクルならto_char(hoge_date_col,'yyyymmdd')
のファンクション索引を作れば文字列と同じ性能になりますね。 日付を文字列で扱うだけの前提付きだったらCHARで良いと思います。 http://biz.rivus.jp/datetime_or_datetime_string.html データディクショナリ中でも文字列で格納というのが結構あります。 [ メッセージ編集済み 編集者: Tetra 編集日時 2007-06-13 13:29 ] [ メッセージ編集済み 編集者: Tetra 編集日時 2007-06-13 13:30 ] |
|
投稿日時: 2007-06-13 15:03
利用目的次第じゃないでしょうかね。
単純な比較だけなら文字列の方が早いにしても、 現在日時より前後10日とか・・・ そんな感じの日付計算が必要になるようなシチュエーションなら 日付型の方が早くなるでしょう。 |
|
投稿日時: 2007-06-28 09:25
自分でも調べてみたのですが、確かにデータディクショナリでも似たような使い方をしている部分がありました。
単に私の勉強不足だったようです。 本当にお騒がせしました。 |
1
