我已经使用pgAdmin 3和Postgres 8.4.4进行了测试,并关闭了自动清理功能。每当我点击已更改的表时,提示框立即显示。建议运行VACUUM
表模式.表中的预估行数与实际行数有很大偏差。您应该在此表上运行VACUUM ANALYZE。
假设我正在用Java开发基于Web的系统,如何检测表是否过时,以便我可以显示像pgAdmin中那样的提示?
由于我的应用程序的性质,这里有一些规则必须遵循:
我想知道pg_stats和pg_statistic中某个表的统计信息是否是最新的。
我无法设置postgresql.conf中的autovacuum标志。(换句话说,autovacuum标志可以打开或关闭。我无法控制它。我需要知道是否有更新的统计数据,不管autovacuum标志是否打开.)
我不能每次都运行vacuum/analyze来使其最新。
当有任何对该表进行的更新(例如删除、插入和更新)未反映在pg_stats和pg_statistic中时,当用户选择该表时,我需要显示表已过时的提示。
通过分析pg_catalog.pg_stat_all_tables中的时间戳似乎不可行。当然,如果一个表之前没有被分析过,我可以检查last_analyze中是否有时间戳来判断该表是否是最新的。然而,使用这种方法,当已经存在时间戳时,我无法检测表是否是最新的。换句话说,无论我向表中添加多少行,在pg_stat_all_tables中它的last_analyze时间戳始终是第一次分析的时间(假设autovacuum标志关闭)。因此,我只能在第一次显示“建议运行VACUUM”提示。
通过比较last_analyze时间戳和当前时间戳也不可行。表可能几天内没有更新,也可能在一个小时内有大量更新。
在这种情况下,我该如何始终确定表的统计信息是否是最新的?