如何通过分区表加速服务器端聚合

时间:2019-04-03 00:40:11

标签: postgresql aggregate partitioning query-performance

背景

我正在从具有3 * 10 ^ 9行的RDS上的Postgres 10.6中的规范化分区表中生成Tukey箱须图。

我已经开始依次使用多个视图,包括聚合步骤和随后的异常值检测步骤。 首先,在汇总步骤中,我计算中值,25%,75%,IQR,(25%-1.5 * IQR)下晶须和(75%+ 1.5 * IQR)上晶须。其次,在异常值检测步骤中,我在表中搜索晶须之外的值。

聚合

create view aggregation as
select
    a.a_name,
    b.b_name,
    c.c_name,
    percentile_cont(0.5) within group (order by d.D) as median,
    etc for 75%, IQR, whiskers
from dtable as d
join atable as a on a.a_id = d.a_id
join etable as e on e.e_id = d.e_id
join ftable as f on f.f_id = e.f_id
join btable as b on b.b_id = f.b_id
join ctable as c on c.c_id = b.c_id
where (d.e_id between 3440500 and 3459500)
and (c.c_name = 'this_c_in_particular')
and (b.b_name in ('first_b', 'second_b', 'third_b'))
group by
a.a_name,
b.b_name,
c.c_name
;

请注意,dtablee_id分区

离群值检测

create view outliers as
select d.*
from dtable as d
join atable, etable, ftable, btable, ctable
join aggregation as agg on
    agg.a_name = atable.a_name,
    agg.b_name = btable.b_name,
    agg.c_name = ctable.c_name
where d.value < agg.lower_whisker or d.value > agg.upper_whisker
;

结果

当前,使用平面客户端熊猫数据帧,我可以在网络传输和服务器端下采样后不到10秒的时间内执行这些聚合。但是,在客户端,这些聚合至少需要1分钟才能运行。

(解释分析)计划可在此处使用:https://explain.depesz.com/s/0gAu

问题

  1. 是否存在用于快速计算这些聚合的标准方法?
  2. 有没有办法让Postgres并行计算这些东西,每组1个工人?

任何见识或讨论都非常受欢迎-感谢您阅读。

1 个答案:

答案 0 :(得分:2)

执行计划有一些我不了解的事情:

  • 如果未计划任何并行工作器,为什么会有Gather节点?我会从loops中期望两名工人。

  • expain.depesz.com为什么不计算底部节点的895693迭代次数(也许和我一样被上面的困惑所迷惑)?

尽管如此,仍然可以立即发现一些问题:

  • 错误估计很严重(实际行数是725693,而不是895693!)。

  • 您的大部分时间都花在溢出磁盘上。

因此,您可以在不重写查询的情况下改进以下内容:

  • 增加work_mem直到排序为quicksort memory。 那应该是最大的收获。

    您不必全局增加它,可以运行以下命令:

    BEGIN;
    SET LOCAL work_mem = '1GB';
    SELECT /* your query */;
    COMMIT;
    
  • 某些表似乎具有过时的统计信息。尝试ANALYZE讨论所有表,也许这样做有好处。

  • 通过避免错误引导的嵌套循环连接,您可能还可以节省几秒钟的时间。也许ANALYZE会解决这个问题。

    作为最后的选择,您可以通过为一个查询设置enable_nestloop = off来简单地禁用该查询的嵌套循环,其设置方法与上述work_mem所示的技巧相同。

对分区表进行扫描不是您的问题,因此您不必担心并行化(PostgreSQL v11已经变得更加智能)。

如果上述所有方法都不能使查询足够快,则可以考虑使用物化视图。然后,您会获得稍微陈旧的数据,但速度很快。