I really appreciate all the work to make vacuum better. Anything that helps our problem of autovacuum not scaling well for large tables is a win.
I'm not overly familiar with this part of the code base, but here are some questions/ideas: + /* + * Every block marked all-frozen in the VM must also be marked + * all-visible. + */ + if (new_rel_allfrozen > new_rel_allvisible) + new_rel_allfrozen = new_rel_allvisible; + Maybe tweak either the comment, or the code, as I read that comment as meaning: if (new_rel_allfrozen > new_rel_allvisible) new_ral_allvisible = new_rel_allfrozen; + /* + * If we are modifying relallvisible manually, it is not clear + * what relallfrozen value would make sense. Therefore, set it to + * -1, or unknown. It will be updated the next time these fields + * are updated. + */ + replaces[ncols] = Anum_pg_class_relallfrozen; + values[ncols] = Int32GetDatum(-1); Do we need some extra checks later on when we are actually using this to prevent negative numbers in the calculations? It's only going to make pcnt_unfrozen something like 1.0001 but still might want to skip that. In autovacuum.c, seems we could simplify some of the logic there to this?: if (relpages > 0 && reltuples > 0) { relallfrozen = classForm->relallfrozen; relallvisible = classForm->relallvisible; if (relallvisible > relpages) relallvisible = relpages; if (relallfrozen > relallvisible) relallfrozen = relallvisible; pcnt_unfrozen = 1 - ((float4) relallfrozen / relpages); } vacinsthresh = (float4) vac_ins_base_thresh + vac_ins_scale_factor * reltuples * pcnt_unfrozen; Again, I'm not clear under what circumstances will relallvisible > relpages? Cheers, Greg