首页 > 解决方案 > 使用 GROUP BY 时的 Postgres 查询速度慢

问题描述

我在 postgres 数据库中有表。行达到 2 mio 行后,查询变慢。这是我的查询

SELECT
c.source,
c.destination,
c.product_id,
sum(c.weight),
count(c.weight),
c.owner_id 
FROM stock c 
GROUP BY c.source, c.destination, c.product_id, c.owner_id;

我已经添加了索引

CREATE INDEX stock_custom_idx ON public.stock USING btree (source, destination, product_id, owner_id)

查询很慢,所以我解释了分析,但没有调用索引。

那么,如何优化这个查询,因为它耗时太长而且没有返回数据?

标签: postgresqlgroup-byquery-optimizationpostgresql-10

解决方案


试试这个索引:

CREATE INDEX better_index ON public.stock USING btree
    (source, destination, product_id, owner_id, weight);

如果不包括weight,则仍需要从表中获取此信息,因此您将进行全表扫描。

使用新索引,您应该进行仅索引扫描。此外,查询计划器可以利用索引的排序顺序进行分组(就像它可以对您的索引所做的那样)。

在较新版本的 PostgreSQL 中,还会存在该INCLUDE子句,您可以在其中向索引“添加”列,而这不会对排序顺序产生任何影响(数据在那里,但是这部分数据没有排序)。我猜这将使索引对您的查询更加高效。


推荐阅读