gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:10:43 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com