【问题标题】:Slow Postgres Query when using GROUP BY使用 GROUP BY 时的 Postgres 查询速度慢
【发布时间】: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


【解决方案1】:

试试这个索引:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多