我正在创建一个汇总表格,概括给定日期内所有事件。
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
结果相当糟糕——它对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
。我已经尝试对转换后的值建立索引:
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 "::"
有没有一种方法可以利用PostgreSQL索引在时区列转换为日期后使用?