序列和时间戳的替代方案:按时间唯一排序记录

eeb*_*sen 5 oracle sequence timestamp

Oracle 11gR2 Exadata

我需要唯一标识何时创建记录。序列缓存意味着我不能使用基于序列的 ID,而批量插入意味着在一个批次中插入的所有记录都将具有相同的时间戳值(即使使用 TIMESTAMP(9))。类似于 Twitter 的since_id 概念

到目前为止我想到的最好的选择

  • 创建用于每个唯一时间戳的附加序列
  • 不批量插入记录以强制每个记录的唯一时间戳
  • 不缓存序列,尽管有一些讨论认为这不会解决 Exadata 下的问题

这是我的要求:我有一个 API,它允许用户提供一个序列作为标记并请求自那时以来的所有记录。例如,他们请求 1000 条标记为 7 的记录,他们将从我的表中获得 1000 条 ID 大于 1007 的记录。例如,假设返回的 1000 条记录的数字最大 ID 是 2045,因此我们返回 2045 作为标记 后来客户端请求 1000 条记录,标记为 2045,期望获得下一批 1000 条记录和一个新标记。

一种非常简单的方法,允许他们获取适合他们的任何大小的所有记录而不会丢失任何记录。但是,由于跨多个 Exadata 节点的序列缓存,在客户端请求 1000 条标记为 1007 的记录时,可能尚未创建 ID 为 2020 的记录。因此,当他们使用标记 2045 执行下一个请求时,他们将永远错过记录 2020。使用 ID 获取关联记录的时间戳可以解决这个问题,但是我必须确保始终将记录单独插入表中以保证唯一的时间戳。

假设:

  • 不是在批量/批量插入中为单个记录获取单独时间戳的方法
  • 即使在序列上使用 NOCACHE,多个节点也可能导致记录的插入是非时间顺序的(例如,序列值为 180 的记录可以使用大于序列值为 179 的记录的系统时间戳写入)

希望我只是没有找到正确的术语来搜索现有答案。我觉得这是一个多年来应该通过某些模式解决的问题。我认为 Twitter 已经解决了它......

小智 5

我建议按时间戳排序。只要具有相同时间戳的唯一记录插入到同一事务中,您就可以使用基于序列的 ID 作为二级排序。