【发布时间】:2016-01-11 14:53:10
【问题描述】:
我正在创建一个汇总表,用于汇总给定日期的所有事件。
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。我已经尝试为演员编制索引:
CREATE INDEX event_creation_time_date_idx ON event USING BTREE(creation_time::DATE);
但出现错误:
ERROR: syntax error at or near "::"
有没有办法在转换为 DATE 的时区列上使用 PostgreSQL 索引?
【问题讨论】:
-
我是否因为太多的 SQL JOIN 而失去了 JOIN?这是一个 JOIN 问题 我在不到一个月前提出的问题 的 JOIN 副本。 JOIN假期和JOIN好JOIN书JOIN JOIN JOIN!
标签: sql postgresql date indexing casting