【发布时间】:2011-10-17 18:01:32
【问题描述】:
在pgAdmin中,每当表的统计信息过期时,都会提示:
推荐运行 VACUUM
表 schema.table 上的估计行数有偏差 与实际行数显着不同。你应该运行 VACUUM ANALYZE 在这张桌子上。
我已经使用 pgAdmin 3 和 Postgres 8.4.4 对它进行了测试,autovacuum=off。每当我单击已更改的表时,都会立即显示提示。
假设我正在用 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 时间戳与当前时间戳进行比较也是不可行的。几天内该表可能没有任何更新。一小时内可能会有大量更新。
在这种情况下,我如何才能始终判断表的统计信息是否是最新的?
【问题讨论】:
标签: postgresql statistics analyzer vacuum