我怎么知道Postgres表的统计数据是否是最新的?

时间:2011-08-01 20:17:07

标签: postgresql statistics analyzer vacuum

在pgAdmin中,只要表的统计信息已过时,就会提示:

  

建议运行VACUUM

     

表schema.table上的估计rowcount有所不同   显着的实际行数。你应该运行VACUUM ANALYZE   在这张桌子上。

我使用pgAdmin 3和Postgres 8.4.4测试了它,autovacuum = off。每当我点击已更改的表时,会立即显示提示。

假设我正在使用Java创建基于Web的系统,如何检测表是否已过时,以便我可以在pgAdmin中显示提示?

由于我的应用程序的性质,我必须遵循以下几条规则:

  1. 我想知道pg_stats和pg_statistic中某个表的统计信息是否是最新的。

  2. 我无法在postgresql.conf中设置autovacuum标志。 (换句话说,autovacuum标志可以打开或关闭。我无法控制它。我需要判断统计数据是否是最新的autovacuum标志是打开还是关闭。)

  3. 我无法每次都进行真空/分析以使其保持最新状态。

  4. 当用户选择一个表时,我需要在pg_stats和pg_statistic中没有反映此表的任何更新(例如drop,insert和update)时显示该表已过时的提示

  5. 通过分析pg_catalog.pg_stat_all_tables中的时间戳,似乎不可行。当然,如果以前没有分析过某个表,我可以检查它是否在last_analyze中有一个时间戳,以确定该表是否是最新的。但是,使用此方法,当已经有时间戳时,我无法检测表是否是最新的。换句话说,无论我向表添加多少行,pg_stat_all_tables中的last_analyze时间戳总是用于第一次分析(假设autovacuum标志已关闭)。因此,我只能首次显示“正在运行VACUUM”提示。

    通过将last_analyze时间戳与当前时间戳进行比较,这也是不可行的。几天内可能没有对表格进行任何更新。一小时内可能会有大量的更新。

    鉴于这种情况,我怎样才能始终判断表的统计信息是否是最新的?

2 个答案:

答案 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中),并且服务器根据自己的内部统计信息处理VACCUMANALYZE进程。您可以配置它应该运行的频率,以及它要处理的阈值变量。