postgresql - 我怎么知道 Postgres 表的统计信息是否是最新的?

标签 postgresql statistics analyzer vacuum

在 pgAdmin 中,每当表的统计信息过时时,它会提示:

Running VACUUM recommended

The estimated rowcount on the table schema.table deviates significantly from the actual rowcount. You should run VACUUM ANALYZE on this table.

我已经使用 pgAdmin 3 和 Postgres 8.4.4 测试了它,并设置了 autovacuum=off。每当我单击已更改的表格时,提示都会立即出现。

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

由于我的应用程序的性质,这里有一些我必须遵循的规则:

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

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

    <
  3. 我无法每次都运行 vacuum/analyze 以使其保持最新状态。

  4. 当用户选择一个表时,我需要在这个表有任何更新(如删除、插入和更新)没有反射(reflect)在 pg_stats 和 pg_statistic 中时显示该表已过时的提示.

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

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

在这种情况下,我如何才能始终判断表的统计信息是否是最新的?

最佳答案

检查系统目录。

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

关于postgresql - 我怎么知道 Postgres 表的统计信息是否是最新的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6903938/

相关文章:

java - 在大型数据库缓存中删除或标记为已删除?

windows - 如何在 Windows 上安装 PLV8?

ios - 单例设计潜在泄漏

visual-studio - 为什么在尝试使用Visual Studio Analyzer时遇到错误?

ruby-on-rails - 您的 Gemfile 不止一次列出了 gem。可能会导致错误

sql - 在 order by 子句中使用 bool 表达式

r - 在 R 中绘制多个函数

R 中的相对频率

encoding - 哪些统计数据表明 Z3 的运行效率很高?

xcode - 什么样的内存泄漏 XCode Analyzer 可能不会注意到?