Postgres指数绩效问题

时间:2018-07-12 15:52:04

标签: sql postgresql performance indexing

我在下面查询

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

如何在此处提高性能?

1 个答案:

答案 0 :(得分:0)

如果大部分时间都花在按日期排序上,请尝试以下操作:

CLUSTER event_log USING gevent1;

要在Postgres上建立聚簇索引,然后再次运行查询,看看它是否更快。

来源: https://www.postgresql.org/docs/9.4/static/sql-cluster.html