PostgreSQL中最新的表修改时间

时间:2012-10-05 16:17:32

标签: sql postgresql

我需要获取表格的最新修改时间,因此遇到了

select relfilenode from pg_class where relname = 'test';

它给了我relfilenode id,这似乎是

中的目录名
L:\Databases\PostgresSQL\data\base\inodenumber

我稍后会提取最新的修改时间。

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

2 个答案:

答案 0 :(得分:5)

测试表的relfilenode的mtime将无法正常工作。正如Eelke所指出的那样VACUUM将修改时间戳。提示位设置也会修改表格,使其看起来被SELECT“修改”。此外,有时一个表有一个以上的磁盘关系(1GB块),你必须检查所有它们以找到最新的。

如果要保留表的上次修改时间,请添加AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ... FOR EACH STATEMENT触发器,以更新用于跟踪修改时间的表中的时间戳行。

触发器的缺点是它会对桌面上的单行锁定进行竞争,因此它将序列化您的所有交易。它还会大大增加陷入僵局的可能性。你真正想要的可能是非事务性的东西,当事务发生时不需要回滚,如果多个事务更新计数器,则最高值获胜。没有内置的内容,但它可能不像C扩展那么难。

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

在任何情况下,触发器都不会捕获DDL。 DDL触发器(“事件触发器”)将在第9.3页中出现。

另见:

答案 1 :(得分:1)

我认为这不会完全可靠,因为真空还会修改包含表格的文件,但表格的逻辑内容在真空期间不会改变。

您可以为INSERT,UPDATE和DELETE创建触发器,以维护另一个表中每个表的上次修改时间戳。此方法会对性能产生轻微影响,但会提供准确的信息。