PostgreSQL: Create an index on timestamp::DATE [duplicate]

爷,独闯天下 提交于 2020-05-12 11:22:13

问题


I am creating a summary table that sums up all events in a given day.

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;

The creation_time column is indexed:

CREATE INDEX event_creation_time_date_idx ON event USING BTREE(creation_time);

However, the query runs a pretty long time even when only querying two days of data with a handful of events (January 1-2 2014).

The EXPLAIN on the query is pretty grim - it runs a sequential scan on the event table, not utilizing the index at all:

->  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))))

I assume this is because we compare a casted value - creation_time::DATE, not creation_time. I have tried indexing the cast:

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

But got an error:

ERROR: syntax error at or near "::"

Is there a way to utilize PostgreSQL indices on a timezone column casted to DATE?


回答1:


An expression in an index declaration should be enclosed in additional brackets, try:

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


来源:https://stackoverflow.com/questions/34724403/postgresql-create-an-index-on-timestampdate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!