我正在设计一个并发安全的增量聚合汇总系统,track_commit_timestamp (pg_xact_commit_timestamp) 听起来很完美。但是我发现很少有关于它的评论,并且无法从源代码中弄清楚它是如何工作的。
希望有人知道我的一个或多个问题的答案:
提交时间戳功能是否有可能产生乱序时间?我所追求的是一种识别自特定时间以来已更改的记录的方法,以便我可以获取任何以后的更改以进行处理。如果有相同的时间戳,我不需要它们以完美的提交顺序。
最终实现中每行添加多少字节?我看到的讨论似乎在 12-24 个字节之间。曾讨论过为“以防万一”添加额外字节。这是 9.5 之前的版本,所以是一个世界之前的版本。
时间戳是否在内部编入索引?用 B 树?我询问容量规划的原因。
我在 StackOverflow 和设计讨论中看到时间戳不是无限期保留的,但无法找到它们存储时间的详细信息。
关于启用 track_commit_timestamp 的性能影响的任何经验法则?我不需要所有表上的数据,但是,在我需要的地方,听起来它可能工作得很好。
有什么问题吗?我尝试在测试表上运行 VACUUM FULL 并且 pg_xact_commit_timestamp 都没有改变。看起来像 VACUUM 这样的物理操作不应该改变任何东西,但很容易有一些我没有想到的东西。而且,老实说,我的快速 VACUUM 测试甚至可能没有任何意义。
非常感谢您的帮助!
我编辑了我的问题以阐明我要完成的任务,我希望根据更新标记跟踪已处理和未处理的数据。
select max(pg_xact_commit_timestamp(xmin)) from scan;-- 2019-07-07 20:46:14.694288+10
update scan set quantity = 5 where quantity = 1; -- Change some data.
select max(pg_xact_commit_timestamp(xmin)) from scan; -- 2019-07-10 09:38:17.920294+10
-- Find the changed row(s):
select *
from scan
where pg_xact_commit_timestamp(xmin) > '2019-07-07 20:46:14.694288+10';
Run Code Online (Sandbox Code Playgroud)
这个想法是对行进行增量和定期汇总。所以,
-- 跟踪上次汇总的时间戳。-- 等待 5 分钟(或其他时间)。 -- 查找当前的最大提交时间戳。-- …