web-dev-qa-db-ja.com

PostgreSQL:timestamp :: DATEにインデックスを作成します

特定の日のすべてのイベントを合計する要約テーブルを作成しています。

INSERT INTO graph_6(
  day,
  event_type,
  (SELECT COUNT(*) FROM event e 
                  WHERE event_type = e.event_type 
                  AND creation_time::DATE = sq.day)
FROM event_type
CROSS JOIN
    (SELECT generate_series(
                (SELECT '2014-01-01'::DATE),
                (SELECT '2014-01-02'::DATE),
                '1 day') as day) sq;

creation_time列にはインデックスが付けられています。

CREATE INDEX event_creation_time_date_idx ON event USING BTREE(creation_time);

ただし、少数のイベントで2日間のデータをクエリするだけでも、クエリはかなり長い時間実行されます(2014年1月1〜2日)。

クエリのEXPLAINはかなり厳しい-eventテーブルで順次スキャンを実行し、インデックスをまったく使用しません。

->  Seq Scan on event e_1  (cost=0.00..12557.39 rows=531 width=38)
Filter: ... AND ((creation_time)::date = (generate_series(($12)::timestamp with time zone, ($13)::timestamp with time zone, '1 day'::interval))))

これは、キャストされた値を比較するためだと思います-creation_time::DATEではなくcreation_time。私はキャストにインデックスを付けてみました:

CREATE INDEX event_creation_time_date_idx ON event USING BTREE(creation_time::DATE);

しかし、エラーが発生しました:

ERROR: syntax error at or near "::"

DATEにキャストされたタイムゾーン列でPostgreSQLインデックスを使用する方法はありますか?

16
Adam Matan

インデックス宣言の式は、追加の角括弧で囲む必要があります。次を試してください:

CREATE INDEX event_creation_time_date_idx ON event ((creation_time::DATE));
32
klin