在 PostgreSQL 中使用单个序列生成器是个坏主意吗?

Is it a bad idea using a single sequence generator in PostgreSQL?

这是一个关于 PostgreSQLsequence性能 的一般性问题,因为它们是否可能成为瓶颈在高 - 连续性数据库中,选择使用一个而不是一个table。

我概述了 性能瓶颈 因为我完全知道 PostgreSQL 序列是安全的,如其他地方所解释的和在 PostgreSQL: Is using SELECT nextval generator thread safe, in harsh multiuser environments?。另外,我不介意序列可能产生的漏洞。

我有多个 tables (< 60),每个都有自己的代理主键 id,声明为

id int generated by default as identity

持有 public 实体的大多数 table 由共享通用 table 的子集详细说明。例如,tables 作为 productcategorypostuser 由 table text 详细说明,它包含所有应用程序中不同语言的 public 对象的 varchars。

由于所有这些 public 实体的 id 列可能具有相同的值,我必须使用对

object_id    int not null,
object_type  tobject not null,

text 唯一地引用到它详述的 public 个实体。

很明显,具有来自单个序列的具有唯一值的 id 列将允许我从所有共享的 table 中删除 object_type 列,并且应用程序的 SQL 代码。它还将简化(广告希望加速)共享 tables.

上的索引

由于我计划增加共享 table 的数量,我的问题是序列生成器如何在高写入并发时执行。当许多并发 insert into 尝试发出 nextval 时,单个序列生成器会成为瓶颈吗?每个table留下一个会更好吗?

不评论你的设计,单序列没问题。

序列针对并发进行了优化,如果 nextval 实际上可能成为瓶颈,您可以更改序列以使用 CACHE n 代替 n > 1。然后每次调用序列实际上得到下一个 n 值,这些值由数据库会话缓存。

确保使用 bigint,而不是 integer 作为数据类型,这样您就不会 运行 乱序值。