0

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

我概述了性能瓶颈,因为我完全知道 PostgreSQL 序列是安全的,正如在其他地方和 PostgreSQL 中解释的那样:在恶劣的多用户环境中使用 SELECT nextval 生成器线程安全吗?. 另外,我不介意序列可能产生的漏洞。

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

id int generated by default as identity

大多数包含公共实体的表都由共享通用表的子集详细说明。例如,表如product、或由 table 详细说明category,它包含应用程序上不同语言的公共对象的所有 varchars。postusertext

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

object_id    int not null,
object_type  tobject not null,

唯一地引用text它详细描述的公共实体。

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

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

4

1 回答 1

1

不在您的设计中发表评论,单个序列将没有问题。

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

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

于 2020-09-04T13:01:24.883 回答