Re: Trigger more frequent autovacuums of heavy insert tables

Melanie Plageman <melanieplageman@gmail.com>

From: Melanie Plageman <melanieplageman@gmail.com>
To: Greg Sabino Mullane <htamfids@gmail.com>
Cc: Pg Hackers <pgsql-hackers@postgresql.org>, Robert Haas <robertmhaas@gmail.com>, Andres Freund <andres@anarazel.de>, Peter Geoghegan <pg@bowt.ie>, David Rowley <dgrowley@gmail.com>
Date: 2024-10-25T15:14:19Z
Lists: pgsql-hackers

Attachments

Thanks for the review!

On Thu, Oct 24, 2024 at 3:51 PM Greg Sabino Mullane <htamfids@gmail.com> wrote:
>
> 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;

I've updated it. An all-frozen block must also be all-visible. But not
all-visible blocks are all-frozen

> +                       /*
> +                        * 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.

Great point! I've added this

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

I've done something similar to this in attached v2.

> Again, I'm not clear under what circumstances will relallvisible > relpages?

I think this is mostly if someone manually updated the relation stats,
so we clamp it for safety.

- Melanie

Commits

  1. doc: Update formula for vacuum insert threshold.

  2. Redefine pg_class.reltuples to be -1 before the first VACUUM or ANALYZE.

  3. Measure the number of all-visible pages for use in index-only scan costing.