[pgsql-jp: 34279] 日付/時刻データ型の比較とパフォーマンス

Takanori Oba oba @ uchida.co.jp
2004年 11月 16日 (火) 16:14:55 JST


大羽と申します。

例えば hoge というTIMESTAMP(without time zone)型の列があるとして

SELECT .. WHERE hoge = 'now';
SELECT .. WHERE hoge = CURRENT_DATE

といったように、日付/時間データ型に対し'now'、now()、
CURRENT_DATE、CURRENT_TIMESTAMP、CURRENT_TIME 等のキーワード・
関数を使用してFilter処理をかけるとします。

'now'や '2004-11-11'等で指定した場合と、CURRENT〜〜〜で指定した
場合とでは、EXPLAIN ANALYZE の結果を見る限り、パフォーマンスに
かなりの差が出てくるようです。
CURRENT〜〜〜を用いた方が遅くなります。
(cost、actual time、run time 全てで悪化が確認できる)

テーブル構成・件数・SQLなど、条件にもよりますが良くても1.5倍程度、
悪いと数十〜数百倍のパフォーマンス悪化が確認できました。
(TIMESTAMP以外のデータ型でも試しましたが、悪化します)


EXPLAIN ANALYZE の結果では、日付/時間データ型の比較におけるキャストの
回数・仕方がパフォーマンスに影響を与えていると推測できます。
テーブルサイズを数十〜数百万件にしてみると、その性能の差がかなり顕著に
出ます。

■ WHERE hoge = 'now' の場合
Filter: (hoge = '今日の日付'::timestamp without time zone)

■ WHERE hoge = CURRENT_DATE の場合
Filter: (hoge = (('now'::text)::date)::timestamp without time zone))

■ WHERE hoge = CURRENT_TIMESTAMP の場合
Filter: ((hoge)::timestamp with time zone = ('now'::text)::timestamp(6)
with time zone)

■ WHERE hoge = CURRENT_TIME の場合
Filter: ((hoge)::text = (('now'::text)::time(6) with time zone)::text)

# 諸事情により、今すぐには EXPLAIN ANALYZE の結果全てを載せることが
# できません・・・

この中ではCURRENT_TIMEを使った場合が最も遅く、30万件程のデータで
'now'と比べて20倍以上のrun timeを要しています。

すぐにでも試せる例としては、

EXPLAIN ANALYZE SELECT 'now';
EXPLAIN ANALYZE SELECT CURRENT_DATE;
EXPLAIN ANALYZE SELECT CURRENT_TIMESTAMP;
EXPLAIN ANALYZE SELECT CURRENT_TIME;

などでも微妙な差が確認できます。キャスト云々は確認できませんが :-(


ここで質問なのですが、このような現象は一般的な(或いは既知の)現象なの
でしょうか?
私が探した限りでは、マニュアルにはこのような現象の説明が載っていなかった
と思うのですが。

ちなみに、環境依存では無いと思いますが、この現象が発生した環境は

Pentium4 1.4GHz 512MB RAM
Red Hat Linux 7.2
PostgreSQL 7.3.2

です。

# いずれも結構古いです・・・

またはPostgreSQLのバージョンによっても結果が違うのでしょうか。

提供できる情報が中途半端ですが、宜しくお願い致します。
-- 
oba @ uchida.co.jp



pgsql-jp メーリングリストの案内