【问题标题】:Postgres table with thousands of partition具有数千个分区的 Postgres 表
【发布时间】:2021-04-08 02:43:05
【问题描述】:

我有一个 postgres 表(在 postgres12 中),它应该在不久的将来有数千个分区(至少 200k)。

这是我创建父表的方式:

create table if not exists content (
    key varchar(20) not NULL,
    value json not null default '[]'::json
) PARTITION BY LIST(key)

然后添加任何给定的子表,例如:

create table if not exists content_123 PARTITION OF content for VALUES in ('123');

我还在子表顶部添加一个索引以便快速访问(因为我将直接访问子表):

create index if not exists content_123_idx on content_123 using btree(key) 

这是我的问题:我过去从未在 postgres 表中管理过这么多分区,所以我只是想知道做我正在做的事情有什么缺点吗?另外,(如上所述)我不会直接从父表中查询,而是直接从各个子表中读取。

【问题讨论】:

  • 嗨!每个 pk 一个分区/表?每个子表一行?我认为这不是一个好主意。可能与范围有关。通过,我不知道,1k 行。
  • 不。多行对应一个子表中的一个键。

标签: postgresql partitioning


【解决方案1】:

有了这些表定义,索引就完全没用了。

有了200000个分区,查询计划会变得慢的不能忍受,每条SQL语句都需要非常多的锁和打开文件。这不会很好。

将几个键合并到一个分区中(然后索引可能有意义)。

【讨论】:

  • 它需要很多锁和打开文件,即使我一次查询一个子表?
  • 如果您在单独的事务中查询它们,则不会。但是你不需要分区,对吧?只要减少分区的数量,就可以了。
  • 是的,我将在单独的事务中访问它们(尽管使用单个会话)。你是对的,在这种情况下我可能不需要分区。但是,我正在分区以执行 drop table content cascade 之类的操作,以一次性删除所有子表(而不是单独跟踪和删除所有表)以及类似的其他任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2022-10-13
相关资源
最近更新 更多