首页 > 解决方案 > 基于表名的 Postgres 表分区

问题描述

我有一个表,其中存储有关特定事件和特定时间戳的天气信息。我在这张表上插入、更新和选择(比删除更频繁)。我的所有查询都查询时间戳和 event_id。由于这张表正在爆炸,我正在考虑在 postgres 中进行表分区。

  1. 我还可以考虑拥有多个表并将它们命名为“table_< event_id >_< timestamp >”来存储特定的时间戳信息,而不是使用 postgres 声明/继承分区。但是,我注意到互联网上没有人做过或写过这样的方法。有什么我想念的吗?
  2. 我看到在 postgres 分区中,数据既保存在主表中,也保存在子表中。为什么要在这两个地方保留?对我进行插入和更新似乎效率较低。
  3. 当 postgres 开始阻塞时,表的数量是否有一般限制?

谢谢!

标签: postgresqldatabase-performancedatabase-partitioningpostgresql-11

解决方案


重新 1) 不要这样做。如果 Postgres 开发人员已经通过提供声明性分区为您完成了这项工作,为什么还要重新发明轮子

重新2)你错了。数据保存在它所属的分区中。它看起来好像存储在“主”中。

重新 3) 没有内置限制,但任何超出“几千”分区的东西都可能太多了。它仍然可以工作,但特别是查询计划会更慢。有时查询执行也可能会受到影响,因为运行时分区修剪不再那么有效。

根据您的描述,您可能希望对事件 ID 进行哈希分区,然后在时间戳值上创建范围子分区(因此事件的每个分区再次在时间戳范围内进行分区)


推荐阅读