postgresql - 在 Amazon RDS Postgres 上分组太慢

标签 postgresql amazon-web-services amazon-rds database-tuning query-tuning

我在 Amazon RDS db.r3.4xlarge 实例上运行 Postgres 9.4.4 - 16 个 CPU,122GB 内存。 我最近遇到了一个查询,它需要在一个大表(约 2.7 亿条记录)上进行相当直接的聚合。执行该查询需要 5 个多小时。

大表上的连接列和分组列定义了索引。我已经尝试通过将每个设置为 1GB 来试验 work_memtemp_buffers,但它有很大帮助。

这是查询和执行计划。任何线索将不胜感激。

explain SELECT
largetable.column_group,
MAX(largetable.event_captured_dt) AS last_open_date,
.....   

FROM largetable

LEFT JOIN smalltable
ON smalltable.column_b = largetable.column_a

WHERE largetable.column_group IS NOT NULL

GROUP BY largetable.column_group

这是执行计划 -

GroupAggregate  (cost=699299968.28..954348399.96 rows=685311 width=38)
  Group Key: largetable.column_group
  ->  Sort  (cost=699299968.28..707801354.23 rows=3400554381 width=38)
        Sort Key: largetable.column_group
        ->  Merge Left Join  (cost=25512.78..67955201.22 rows=3400554381 width=38)
              Merge Cond: (largetable.column_a = smalltable.column_b)
              ->  Index Scan using xcrmstg_largetable_launch_id on largetable  (cost=0.57..16241746.24 rows=271850823 width=34)
                    Filter: (column_a IS NOT NULL)
              ->  Sort  (cost=25512.21..26127.21 rows=246000 width=4)
                    Sort Key: smalltable.column_b
                    ->  Seq Scan on smalltable  (cost=0.00..3485.00 rows=246000 width=4)

最佳答案

你说大表的joining key和grouping key有索引,但是你没有提到小表的joining key。

合并和排序是速度缓慢的一个重要来源。但是,我也担心您会返回大约 700,000 行数据。那真的对你有用吗?你需要返回那么多数据,但 5 小时的等待时间太长,这是什么情况?如果您不需要输出所有这些数据,那么尽早过滤是您将实现的最大速度增益。

关于postgresql - 在 Amazon RDS Postgres 上分组太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33987428/

相关文章:

c# - 如何配置连接字符串到 RDS 实例 (MSSQLServer Express)

RDS 的 Terraform AWS 安全组条目

ruby-on-rails - Rails + Postgres - 小数作为字符串存储在数据库中

php - 如何从浏览器游戏设计数据库访问

amazon-web-services - AWS S3 - ACL 与 CORS 配置与存储桶/对象权限

amazon-web-services - Amazon AMI 和 EBS 快照有什么区别

string - AWS Cloudformation 属性 SubnetIds 的值必须为字符串列表类型

ruby-on-rails - 强制 $ rake db :reset Despite Other Users with Postgres

sql - 如何将记录作为参数传递给 PL/pgSQL 函数?

node.js - 从 AWS Lambda 提供 zip 文件