我需要获取表格的最新修改时间,因此遇到了
select relfilenode from pg_class where relname = 'test';
它给了我relfilenode id,这似乎是
中的目录名L:\Databases\PostgresSQL\data\base\inodenumber
我稍后会提取最新的修改时间。
这是正确的方法吗?还是有更好的方法来做同样的事情
答案 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创建触发器,以维护另一个表中每个表的上次修改时间戳。此方法会对性能产生轻微影响,但会提供准确的信息。