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

问题描述

这是有关Postgresql sequence 性能的通用问题,因为在选择使用一个时,它们是否可能成为高写入并发数据库中的瓶颈而不是每个表一个

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

我有许多表(id,声明为

id int generated by default as identity

大多数包含公共实体的表都是通过共享通用表的子集进行详细说明的。例如,表product详细描述了categorypostusertext等表,该表保存了不同对象的公共对象的所有varchar。应用程序上的语言。

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

object_id    int not null,object_type  tobject not null,

唯一地引用text到其详细信息的公共实体。

很明显,具有来自单个序列的具有唯一值的id列将使我能够从所有共享表和应用程序的sql代码删除object_type列。它还可以简化(希望加速)共享表上的索引。

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

解决方法

不对设计发表评论,一个序列就没问题。

针对并发优化了序列,并且如果nextval实际上威胁到瓶颈,则可以更改序列以将CACHE n用于n > 1。然后,对序列的每次调用实际上都会获得下一个n值,这些值由数据库会话缓存。

请确保将bigint和机器人integer用作数据类型,以免序列值用尽。