gpt4 book ai didi

sql - PostgreSQL 中表的最新修改时间

转载 作者:行者123 更新时间:2023-11-29 11:24:50 25 4
gpt4 key购买 nike

我需要获取一个表的最新修改时间,所以遇到了

select relfilenode from pg_class where relname = 'test';

这给了我 relfilenode id,这似乎是一个目录名

L:\Databases\PostgresSQL\data\base\inodenumber

我后来提取了最新的修改时间。

这是正确的方法还是有更好的方法来做同样的事情

最佳答案

测试表的 relfilenode 的 mtime 不会很好地工作。正如 Eelke 指出的那样,VACUUM 在其他操作中将修改时间戳。提示位设置也会修改表,导致它看起来像是被 SELECT“修改”了。此外,有时一张表对其磁盘关系(1GB block )有多个分支,您必须检查所有分支以找到最新的。

如果您想保留表的最后修改时间,请添加一个 AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ... FOR EACH STATEMENT 触发器来更新您使用的表中的时间戳行用于跟踪修改时间。

触发器的缺点是它会争夺表上的单个行锁,因此它会序列化您的所有事务。它还会大大增加出现死锁的机会。您真正想要的可能是非事务性的东西,当事务执行时不必回滚,如果多个事务更新计数器,则最高值获胜。没有内置的东西,尽管它作为 C 扩展可能不会太难。

一个稍微复杂一点的选择是创建一个触发器 uses dblink更新最后更新的计数器。这将避免大多数争用问题,但它实际上会使死锁变得更糟,因为 PostgreSQL 的死锁检测将无法“看到”两个 session 通过中介死锁的事实。您需要一种带有超时的SELECT ... FOR UPDATE 方法,以使其可靠而不会过于频繁地中止事务。

无论如何,触发器不会捕获 DDL。 DDL 触发器(“事件触发器”)将出现在 Pg 9.3 中。

另见:

关于sql - PostgreSQL 中表的最新修改时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12750222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com