我需要获取表格的最新修改时间,所以遇到了
select relfilenode from pg_class where relname = 'test';
这给了我 relfilenode id,这似乎是一个目录名
L:\Databases\PostgresSQL\data\base\inodenumber
我后来提取了最新的修改时间。
这是正确的方法还是有更好的方法可以做到这一点
我需要获取表格的最新修改时间,所以遇到了
select relfilenode from pg_class where relname = 'test';
这给了我 relfilenode id,这似乎是一个目录名
L:\Databases\PostgresSQL\data\base\inodenumber
我后来提取了最新的修改时间。
这是正确的方法还是有更好的方法可以做到这一点
测试表的 relfilenode 的 mtime 将无法正常工作。正如 EelkeVACUUM
在其他操作中指出的那样,将修改时间戳。提示位设置也会修改表,使其看起来被SELECT
. 此外,有时一张表与其磁盘关系(1GB 块)有多个分支,您必须检查所有这些分支才能找到最新的。
如果要保留表的最后修改时间,请添加一个AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ... FOR EACH STATEMENT
触发器来更新用于跟踪修改时间的表中的时间戳行。
触发器的缺点是它会竞争表上的单行锁,因此它会序列化所有事务。它还会大大增加出现死锁的机会。您真正想要的可能是非事务性的,在事务发生时不必回滚,如果多个事务更新一个计数器,则最高值获胜。没有类似的内置功能,尽管它可能不像 C 扩展那样难。
一个稍微复杂一点的选项是创建一个触发器,用于dblink
更新最后更新的计数器。这将避免大多数争用问题,但实际上会使死锁变得更糟,因为 PostgreSQL 的死锁检测将无法“看到”两个会话通过中介死锁的事实。您需要一种SELECT ... FOR UPDATE
超时方法以使其可靠,而不会过于频繁地中止事务。
不过,无论如何,触发器都不会捕获 DDL。DDL 触发器(“事件触发器”)将出现在 Pg 9.3 中。
也可以看看:
我认为这不是完全可靠的,因为真空也会修改包含表格的文件,但表格的逻辑内容在真空期间不会改变。
您可以为 INSERT、UPDATE 和 DELETE 创建触发器,以维护另一个表中每个表的最后修改时间戳。此方法对性能有轻微影响,但会提供准确的信息。