【发布时间】:2021-04-08 17:28:02
【问题描述】:
我有遗留但相当大(~25Gb)的数据库,设计有问题。整个数据库中常用的“模式”归结为以下几点:
- 将逻辑部分分成不同的表(journal_1、journal_2、journal_n)
- 所有表都有一个唯一的 bigserial/autoincrement 字段(journal_id_seq_1、journal_id_seq_2、journal_id_seq_n)
- 所有表都有一个或多个外键指向一个或多个引用表(日志表有 2 个外键,一组表具有另一个结构(log_1、log_2、log_n)仅引用一个)
我非常好奇(实际上接近于恐慌 :) 如果有大约 50,000 个这样的表会发生什么(现在“只是”大约 15k)。
我的想法是将所有内容(具有相同结构的表)放在一个具有通用名称(比如说日志)的大表中,添加一个带有 journal_id 的列(从后缀 journal_{1|2|3} 中提取)分区通过此列,显然为每个具有相同命名约定的表创建分区表。此外,需要将 bigserial 字段转换为常规 bigint,但我仍然需要为每个分区保留序列并在每次插入时手动调用 nextval。除了 seq_id 之外,还需要使用 journal_id 字段扩展主键。最后,我看到了分片的好处,当数据库变得庞大时,它可以应用于分区。
请分享您对此策略的看法,尤其是关于外键的看法。现在我们至少需要将 max_locks_per_transaction 限制为 512,否则 pg_dump 会失败
ERROR: out of shared memory HINT: You might need to increase max_locks_per_transaction. pg_dump: error: query was: LOCK TABLE。除了锁定噩梦,据我所知,Postgres 对每个数据库的关系有限制(总数很大但不是无限的)。我是否需要为每个分区表创建外键,或者分区表的一部分(某些行)将在插入、删除或更新时被锁定,因为所有分区都只是“存储”而不是真正的关系实体?
提前谢谢你。
【问题讨论】: