在Postgres中使用许多分区的开销

时间:2018-02-09 15:36:21

标签: postgresql

在以下链接中,我使用的工具(Airflow)的创建者建议为维度表的每日快照创建分区。我想知道在Postgres做这样的事情的开销。

我在几个表中使用Postgres 10内置分区,但主要是每月或每年的事实。我之前从未尝试过为尺寸实现日常分区,这似乎很可怕。如果我需要重新运行旧任务,它会在几个方面简化事情。

https://medium.com/@maximebeauchemin/functional-data-engineering-a-modern-paradigm-for-batch-data-processing-2327ec32c42a

  

简单。使用维度快照,其中附加了新分区   每个ETL时间表。维度表成为集合   维度快照,其中每个分区包含完整维度   作为一个时间点。 “但只有一小部分数据   每天都在变化,这就是大量的数据重复!“那就对了,   虽然通常维度表的大小可以忽略不计   事实。这也是解决SCD类型问题的一种优雅方式   它的简单性和可重复性。现在存储和计算都是   与工程时间相比,污垢便宜,快照尺寸使   在大多数情况下都有意义。

     

虽然传统的2型缓慢变化的维度方法是   从概念上讲,声音总体上可能更具计算效率,   管理起来很麻烦。围绕这种方法的过程就像   管理维度上的代理键并执行代理键   在加载事实时查找,容易出错,充满突变和   几乎不可复制。

1 个答案:

答案 0 :(得分:2)

我使用过具有不同分区级别的系统。 通常任何分区都可以,只要您在分区上有检查约束,这允许查询规划器为查询找到足够的分区。或者,您必须直接查询特定分区以查找某些特殊情况。否则,即使是简单查询,您也会看到所有分区上的顺序扫描。

每日分区完全没关系,不用担心。我使用基于PG的数据收集器来处理事件,因为它每天收集几个TB,因此需要为每5分钟的数据分配一次。

只有当您拥有数千或数十万个分区时,分区数量才会成为一个更大的问题 - 这些分区数量一切都会遇到不同级别的问题。

您必须设置正确的max_locks_per_transaction,以便能够使用它们。因为即使是简单的select over parent表也会将SharedAccessLock放在所有分区上,这些分区并不是很好但PG继承可以这样工作。

加上更高的查询计划时间 - 在我们的数据仓库中,我们有时会看到几分钟的查询计划时间和只需几秒钟的查询 - 这有点令人讨厌...但由于当前的PG很难对它进行任何操作规划师以这种方式工作。

但PRO仍然超重CON,因此我强烈建议您使用所需的任何分区粒度。