让我们假设一个表foo
有资格进行 autovacuum 分析,例如,我插入了一些foo
超过autovacuum_analyze_scale_factor * number of rows + autovacuum_analyze_threshold
有效阈值的行。我不知道应该满足哪些条件才能让 autovacuum 对foo
.
foo
只有在没有事务的情况下才会对表运行 autovacuum 分析吗?或者它甚至可以在活动事务期间运行,条件是:(1)没有事务正在读取表的先前版本foo
和(2)自动真空分析可以SHARE UPDATE EXCLUSIVE
锁定表foo
?
这些问题与具体案例有关。我在一个事务中执行大量 INSERT foo
,然后foo
在第二个事务中执行一些 UPDATE。foo
我需要在第二个事务之前运行 autovacuum 分析,以便为我的查询计划程序提供更好的估计的最新统计信息。有没有办法保证 autovacuum 分析将在第二个事务之前运行?也许在事务之间睡几毫秒(我正在从 Java 应用程序运行两个事务)?
公式是正确的。
活动行数取自 中的
reltuples
列pg_class
,并将公式的结果与n_mod_since_analyze
from进行比较pg_stat_all_tables
。请注意,
autovacuum_analyze_scale_factor
andautovacuum_analyze_threshold
可以被表上的存储参数覆盖。如果所有可用的 autovacuum worker 都在运行 (
autovacuum_max_workers
),您可能需要等待。分析只
ACCESS SHARE
对表进行锁定(它只读取),因此它几乎可以与任何东西同时运行。就像SELECT
语句一样,它将看到对其可见的行。如果您需要在 an
INSERT
和 an之间分析一个表UPDATE
,请不要等待 autoanalyze 运行。明确ANALYZE
地从桌子上开始。