希望有人能澄清本文的一部分“可扩展的增量数据聚合”和相应的问题。
假设 Postgres 10 及更高版本。
在 Postgres 10 中,您可以使用 pg_sequence_last_value 函数来检查最近发布的序列号。但是,简单地将所有事件聚合到最近的序列值是不安全的。可能仍有正在进行的事件表写入被分配较低的序列值,但在聚合运行时尚不可见。
是否有 pg_sequence_last_value 的替代品可以保证正确的 seq id?
在具有 BIGSERIAL id 的表(称为事件)中,是否有首选方法来获取最新的 seq id 以用于聚合目的?如果在不同的事务中有待处理的插入(它们将具有更高的序列 ID)并在后续运行中被拾取,那很好。
目标是使用 seq id 在已提交的插入上运行聚合(增量汇总)。
以下三种方法是否保证为已提交的插入返回最新的 seq id 并避免与 pg_sequence_last_value 相关的文章中提到的陷阱?
还有其他技术可以建议吗?
SELECT max(id) FROM events;
SELECT last_value FROM pg_sequences WHERE sequencename='events_id_seq';
SELECT id FROM events ORDER BY id DESC LIMIT 1;
假设read committed
隔离级别
select max(id)
是最可靠的方法。如果您有一个 b-tree 索引,它也非常快
id
(性能实际上与表的大小无关)。执行此操作的一种方法是将更新与事务 ID 相关联。在这种情况下,所有低于 xmin 的更新都可以视为已提交或回滚。请参阅文档: