postgresql 如何知道Postgres表的统计信息是否是最新的?

lrpiutwd  于 2022-11-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(129)

在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时间戳和当前时间戳也是不可行的,因为表可能几天都没有更新,一个小时内可能有大量的更新。
在这种情况下,如何始终判断表的统计信息是否是最新的?

bd1hkmkf

bd1hkmkf1#

检查系统目录。

=> SELECT schemaname, relname, last_autoanalyze, last_analyze FROM pg_stat_all_tables WHERE relname = 'accounts';
schemaname | relname  |       last_autoanalyze        | last_analyze 
------------+----------+-------------------------------+--------------
public     | accounts | 2022-11-22 07:49:16.215009+00 | 
(1 row)

=>

https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW
各种有用的信息都在那里:

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                   |
olhwl3o2

olhwl3o22#

你不必担心你的应用程序中的vacing。相反,你应该在你的服务器上配置autovac进程(在postgresql.conf中),服务器根据它自己的内部统计信息来获取VACCUMANALYZE进程的takes。你可以配置它运行的频率,以及它要处理的阈值变量。

相关问题