PostgreSQL:在timestamp上创建一个索引:: DATE [复制]

前端之家收集整理的这篇文章主要介绍了PostgreSQL:在timestamp上创建一个索引:: DATE [复制]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > @L_403_0@2个
我正在创建一个汇总表,汇总给定日期内的所有事件.
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);

但是,即使仅使用少量事件(2014年1月1日至2日)查询两天的数据,查询也会运行很长时间.

关于查询的EXPLAIN非常严峻 – 它在事件表上运行顺序扫描,根本不使用索引:

->  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索引?

索引声明中的表达式应该包含在其他括号中,请尝试:
CREATE INDEX event_creation_time_date_idx ON event ((creation_time::DATE));

猜你在找的Postgre SQL相关文章