【问题标题】:How is age(datfrozenxid) calculated in PostgreSQL?在 PostgreSQL 中,age(datfrozenxid) 是如何计算的?
【发布时间】:2019-02-20 00:08:42
【问题描述】:

postgres 文档说:

“年龄列衡量从截止日期开始的交易数量 XID 到当前事务的 XID。"

【问题讨论】:

    标签: postgresql database-administration


    【解决方案1】:

    XID 只是序列号,因此计算 XID 的“年龄”是简单的减法,即:

    age(datfrozenxid) = txid_current() - datfrozenxid
    

    initdb 期间创建的数据以及 Postgres 9.4 之前冻结的数据的 XID 将始终报告 2147483647 的年龄。

    age()函数的完整源代码(全部五行)可以在here找到。

    【讨论】:

    • 谢谢尼克,datfrozenxid 是什么?
    • 在你提到的docs中有解释:it is just the minimum of the per-table relfrozenxid values within the database
    • 根据您的回答并检查源代码,在 txid 环绕的情况下,我们可以有,例如,txid_current() = 1000 和 datfrozenxid = 4.294.967.000(一个非常接近环绕的值) .我相信 Age 会有一个奇怪的行为,返回负数 -4.294.966.000,因为它不处理环绕。由于准备一个真正的环绕测试有点困难,我还没有在真正的测试中确认这一点,但从源头来看,这是可以预期的。到目前为止,这使我们无法将年龄用于某些用例。有什么想法吗?
    • @Thiago:在我看来确实是这样......这需要大约 12 个小时来测试,但我会尝试一段时间。
    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 2020-10-20
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2014-09-15
    相关资源
    最近更新 更多