【发布时间】:2021-08-30 05:04:52
【问题描述】:
我在 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)
查询很慢,所以我解释了analyze,但是没有调用索引。
那么,如何优化这个查询,因为它耗时太长而且没有返回数据?
【问题讨论】:
-
这对我来说看起来很奇怪,因为您添加的确切索引应该确实有助于查询。您确定您是在 添加此索引之后而不是在其他某个时间点运行
EXPLAIN的吗? -
@TimBiegeleisen 确定,我已经检查过了
-
当你运行
EXPLAIN时,表的大小是多少?请注意,对于相当小的表大小,Postgres 可能会选择不使用索引。这里的大问题是,如果您有一个非常大的表加上索引,但 Postgres 仍然选择不使用该索引。 -
请edit您的问题并添加使用
explain (analyze, buffers, format text)生成的execution plan(不是只是一个“简单”解释)为formatted text,并确保保留计划的缩进。粘贴文本,然后将```放在计划前一行和计划后一行。还请包括所有索引的完整create index语句。 -
您的查询需要读取和分组表的所有行 - 没有索引可以加快速度。
标签: postgresql group-by query-optimization postgresql-10