1

我正在使用AWS Redshift执行分析查询。该查询执行一些计算并更新密钥的值。此结果将导出到队列系统以供异步客户端使用。但是,由于排队系统不能确保排序,我需要一种机制来确定顺序。我需要类似于“update_version”列的东西,它在每次更新操作中都会增加。这与optimistic locking类似。如何在redshift中实现行级版本控制?

如何在红移中实现此目的?

一种方法是使用时间戳,但它不可靠,因为时间戳是从群集中的单个节点中获取的,并且易于使用clock skew

我不需要全局排序。

注意:请不要建议使用有序队列,因为这个问题的范围之外有不同的挑战。

+0

如果两个进程同时更新密钥的值,为什么一个会比另一个更正确?换句话说,如果您的队列工作人员丢弃比最新处理的信息旧的任何新消息,那么时钟偏斜会产生什么不同? – systemjack

+1

此外,即使给定数据点的值可能分布在多个节点上,只有选定用于运行更新查询的工作节点上的时钟才会被计数。给定更新的各个节点存储区中的所有时间戳值都是相同的。 – systemjack

回答

1

你可以做以下之一:

  • 运行UPDATE my _table SET update_version = update_version+1;
  • 运行INSERT INTO my_table SELECT *, update_version = N FROM my_table;

UPDATE是更具破坏性你的表(现有数据范围变得越来越无序),但更容易查询。 INSERT不太具有破坏性(新数据附加到未分类区域,现有数据不受影响),但如果只需查找当前值,则查询会更加困难。

如果你想使用UPDATE策略,但你关心历史,你应该考虑的是你写的当前行值来执行更新之前一个my_table_history表。