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

在PostgreSQL中使用单个序列生成器是个坏主意吗?,postgresql,postgresql-12,sequence-sql,Postgresql,Postgresql 12,Sequence Sql,这是一个关于PostgreSQL序列性能的一般性问题,因为在选择使用一个而不是每个表使用一个时,它们是否会成为高写并发性数据库中的瓶颈 我概述了性能和瓶颈,因为我非常清楚PostgreSQL序列是安全的,正如其他地方和中所解释的 . 此外,我不介意序列可能产生的孔 我有许多表(1使用CACHE n。然后,对序列的每次调用实际上都会获得下一个n值,这些值由数据库会话缓存 请确保使用bigint,而不是integer作为数据类型,这样您就不会用完序列值。谢谢Laurenz。是的,有必要。共享事实表是

这是一个关于PostgreSQL
序列
性能的一般性问题,因为在选择使用一个而不是每个表使用一个时,它们是否会成为高写并发性数据库中的瓶颈

我概述了性能和瓶颈,因为我非常清楚PostgreSQL序列是安全的,正如其他地方和中所解释的 . 此外,我不介意序列可能产生的孔

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

默认情况下作为标识生成的id int 包含公共实体的大多数表都由共享泛型表的子集详细说明。例如,
product
category
post
user
等表按表
text
进行详细说明,该表包含应用程序上不同语言的公共对象的所有varchar

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

object\u id int不为空,
对象类型为对象不为空,
要唯一地引用它所详述的公共实体,请参见
文本

很明显,如果使用来自单个序列的具有唯一值的
id
列,我就可以从所有共享表和应用程序的SQL代码中删除
object\u type
列。它还可以简化(甚至加速)共享表的索引


当我计划增加共享表的数量时,我的问题是序列生成器如何在高写并发性上执行。当许多并发的
插入到
中试图发出
nextval
时,单个序列生成器是否会成为瓶颈?每个表保留一个会更好吗?

在您的设计中不做注释,一个序列不会有问题

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


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

谢谢Laurenz。是的,有必要。共享事实表是个坏主意?您不能再使用外键来保证不会出现孤立条目。但也许这是值得的。啊,好吧,这是“折扣”:-)