在 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 作为 product
、category
、post
或 user
由 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
作为数据类型,这样您就不会 运行 乱序值。
这是一个关于 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 作为 product
、category
、post
或 user
由 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
作为数据类型,这样您就不会 运行 乱序值。