在pgAdmin中,只要表的统计信息已过时,就会提示:
建议运行VACUUM
表schema.table上的估计rowcount有所不同 显着的实际行数。你应该运行VACUUM ANALYZE 在这张桌子上。
我使用pgAdmin 3和Postgres 8.4.4测试了它,autovacuum = off。每当我点击已更改的表时,会立即显示提示。
假设我正在使用Java创建基于Web的系统,如何检测表是否已过时,以便我可以在pgAdmin中显示提示?
由于我的应用程序的性质,我必须遵循以下几条规则:
我想知道pg_stats和pg_statistic中某个表的统计信息是否是最新的。
我无法在postgresql.conf中设置autovacuum标志。 (换句话说,autovacuum标志可以打开或关闭。我无法控制它。我需要判断统计数据是否是最新的autovacuum标志是打开还是关闭。)
我无法每次都进行真空/分析以使其保持最新状态。
当用户选择一个表时,我需要在pg_stats和pg_statistic中没有反映此表的任何更新(例如drop,insert和update)时显示该表已过时的提示
通过分析pg_catalog.pg_stat_all_tables中的时间戳,似乎不可行。当然,如果以前没有分析过某个表,我可以检查它是否在last_analyze中有一个时间戳,以确定该表是否是最新的。但是,使用此方法,当已经有时间戳时,我无法检测表是否是最新的。换句话说,无论我向表添加多少行,pg_stat_all_tables中的last_analyze时间戳总是用于第一次分析(假设autovacuum标志已关闭)。因此,我只能首次显示“正在运行VACUUM”提示。
通过将last_analyze时间戳与当前时间戳进行比较,这也是不可行的。几天内可能没有对表格进行任何更新。一小时内可能会有大量的更新。
鉴于这种情况,我怎样才能始终判断表的统计信息是否是最新的?
答案 0 :(得分:18)
检查系统目录。
test=# SELECT schemaname, relname, last_analyze FROM pg_stat_all_tables WHERE relname = 'city';
schemaname | relname | last_analyze
------------+---------+-------------------------------
pagila | city | 2011-07-26 19:30:59.357898-07
world | city | 2011-07-26 19:30:53.119366-07
(2 rows)
那里有各种有用的信息:
test=# \d pg_stat_all_tables View "pg_catalog.pg_stat_all_tables"
Column | Type | Modifiers
-------------------+--------------------------+-----------
relid | oid |
schemaname | name |
relname | name |
seq_scan | bigint |
seq_tup_read | bigint |
idx_scan | bigint |
idx_tup_fetch | bigint |
n_tup_ins | bigint |
n_tup_upd | bigint |
n_tup_del | bigint |
n_tup_hot_upd | bigint |
n_live_tup | bigint |
n_dead_tup | bigint |
last_vacuum | timestamp with time zone |
last_autovacuum | timestamp with time zone |
last_analyze | timestamp with time zone |
last_autoanalyze | timestamp with time zone |
vacuum_count | bigint |
autovacuum_count | bigint |
analyze_count | bigint |
autoanalyze_count | bigint |
答案 1 :(得分:2)
您不必担心申请中的空缺。相反,您应该在服务器上配置autovac
进程(在postgresql.conf
中),并且服务器根据自己的内部统计信息处理VACCUM
和ANALYZE
进程。您可以配置它应该运行的频率,以及它要处理的阈值变量。