在亚马逊RDS Postgres上分组速度太慢



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

大表上的联接列和分组列已定义索引。我尝试过将work_memtemp_buffers分别设置为1GB,但这很有帮助。

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

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)

您说大表上的联接键和分组键都有索引,但小表上没有提到联接键。

合并和排序是缓慢的一大原因。然而,我也担心您会返回大约700000行的数据。这对你真的有用吗?在什么情况下,您需要返回那么多数据,但5小时的等待时间太长?如果你不需要所有的数据都出来,那么尽早过滤无疑是你能实现的最大速度增益。

相关内容

  • 没有找到相关文章

最新更新