通过自动递增 PK 排序是否确保按时间顺序排列?

Lor*_*eña 8 postgresql primary-key sequence

从创建的角度来看,假设在 Postgres 中通过自动递增的 PK 排序将按时间顺序对记录进行排序是否安全?我有一个多对多的关系,除了关系本身和某种形式的创建顺序之外,我不需要跟踪其他任何东西。我正在尝试决定是否需要为此合并时间戳列,或者是否可以出于相同目的重新利用现有的自动递增 PK 列。

mus*_*cio 16

假设“自动递增”是指 PostgresSERIAL伪类型,简短的回答是“并不总是”。

SERIAL列是使用标准 SQL 序列实现的,如果CACHE参数设置为大于 1,则在由多个并发会话使用时可能会生成乱序值。手册指出

[A]虽然保证多个会话分配不同的序列值,但当考虑所有会话时,这些值可能会乱序生成。例如,缓存设置为 10,会话 A 可能保留值 1..10 并返回nextval=1,然后会话 B 可能保留值 11..20 并nextval=11在会话 A 生成之前返回nextval=2。因此,当缓存设置为 1 时,可以安全地假设nextval值是按顺序生成的;使用大于 1的缓存设置,您应该只假设这些nextval值都是不同的,而不是它们纯粹是按顺序生成的。

CACHE在高并发环境中,将 value保留为 1 可能会损害性能,因此您必须选择对您更重要的东西。

在我看来,尝试重新调整SERIAL记录创建顺序的用途并不是一个好主意,因为它可能会产生维护问题:因为序列的唯一承诺是为每个请求提供一些独特的递增值nextval,依赖于它在一个情况可能会导致您的应用程序在情况发生变化时出现不可预测的行为,例如,在未来的 Postgres 版本中修改了序列实现细节,或者您的工作负载发生了变化,需要您增加CACHE设置。使用正确的时间戳进行排序更安全,语义更清晰。