在pgAdmin中,每当表的统计信息过期时,它都会提示:
建议运行真空
表schema.table上的估计行数与实际行数相差很大。应对此表运行VACUUM ANALYZE。
我已经用pgAdmin 3和Postgres 8.4.4测试过了,并且autovacuum=off。
假设我正在用Java创建一个基于Web的系统,我如何检测一个表是否过期,以便我可以显示一个类似于pgAdmin中的提示?
由于我的应用程序的性质,我必须遵循以下几条规则:
1.我想知道pg_stats和pg_statistic中某个表的统计信息是否是最新的。
1.我无法在postgresql. conf中设置autovacuum标志。(换句话说,autovacuum标志可以是on或off。我无法控制它。我需要判断autovacuum标志是on还是off的状态是否是最新的。)
1.我不能每次都运行真空/分析以使其保持最新。
1.当用户选择一个表时,如果对该表进行了任何更新(例如删除、插入和更新),而这些更新没有反映在pg_stats和pg_statistic中,我需要显示该表已过期的提示。
通过分析pg_catalog.pg_stat_all_tables中的时间戳似乎是不可行的。当然,如果一个表以前没有被分析过,我可以在last_analyze中检查它是否有时间戳,以了解该表是否是最新的。但是,使用这种方法,当已经有时间戳时,我无法检测该表是否是最新的。换句话说,无论我向表中添加多少行,pg_stat_all_tables中的last_analyze时间戳总是用于第一次分析(假设autovacuum标志关闭)。
通过比较last_analyze时间戳和当前时间戳也是不可行的,因为表可能几天都没有更新,一个小时内可能有大量的更新。
在这种情况下,如何始终判断表的统计信息是否是最新的?
2条答案
按热度按时间bd1hkmkf1#
检查系统目录。
https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW
各种有用的信息都在那里:
olhwl3o22#
你不必担心你的应用程序中的vacing。相反,你应该在你的服务器上配置
autovac
进程(在postgresql.conf
中),服务器根据它自己的内部统计信息来获取VACCUM
和ANALYZE
进程的takes。你可以配置它运行的频率,以及它要处理的阈值变量。