postgresql - 使用 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)
查询很慢,所以我解释了分析,但没有调用索引。
那么,如何优化这个查询,因为它耗时太长而且没有返回数据?
解决方案
试试这个索引:
CREATE INDEX better_index ON public.stock USING btree
(source, destination, product_id, owner_id, weight);
如果不包括weight
,则仍需要从表中获取此信息,因此您将进行全表扫描。
使用新索引,您应该进行仅索引扫描。此外,查询计划器可以利用索引的排序顺序进行分组(就像它可以对您的索引所做的那样)。
在较新版本的 PostgreSQL 中,还会存在该INCLUDE
子句,您可以在其中向索引“添加”列,而这不会对排序顺序产生任何影响(数据在那里,但是这部分数据没有排序)。我猜这将使索引对您的查询更加高效。
推荐阅读
- r - R将股票价格合并到多个csv文件-使用标题作为股票代码
- django - 产品图片 - “无法将模式 RGBA 写入 JPEG”
- ruby-on-rails - rails 验证 - 自定义验证
- python - Python-解析或读取具有不同字符串长度的文本文件
- python - 尝试将 VSCode 调试器附加到进程 ID 时出现错误“等待调试服务器连接超时”
- python - Pandas 自正/负以来的行数
- ios - React Native:如何将文件添加到“Xcode 项目根目录”?
- bash - 读取输入值并将其赋值给 bash 脚本中的参数
- python - 如何连接数组中列中的值
- python - 如何生成一个值位于两个现有列之间的新列