首页 > 解决方案 > Postgres 索引性能问题

问题描述

我有以下查询

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

如何在这里提高性能?

标签: sqlpostgresqlperformanceindexing

解决方案


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

CLUSTER event_log USING gevent1;

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

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


推荐阅读