我在下面查询
explain analyze
select gdate,event_name,count(distinct device_id) as num
from (select gdate, event_name, device_id ,
row_number() over(partition by device_id,event_name
order by created_at) as row_no
FROM event_log
WHERE app_id = 'XXXXXX'
) as t
WHERE row_no = 1
GROUP BY gdate, event_name
ORDER BY gdate DESC
我创建了两个索引,如下所示。
CREATE INDEX gevent1 ON event_log USING btree (gdate DESC, event_name)
CREATE INDEX sortevent ON event_log USING btree (device_id, event_name, created_at)
但是查询仅在计划中使用sortevent,而不在gevent1中使用。
表格记录:1465241
如何在此处提高性能?
答案 0 :(得分:0)
如果大部分时间都花在按日期排序上,请尝试以下操作:
CLUSTER event_log USING gevent1;
要在Postgres上建立聚簇索引,然后再次运行查询,看看它是否更快。
来源: https://www.postgresql.org/docs/9.4/static/sql-cluster.html