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