From: | Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com> |
---|---|
To: | "Tefft, Michael J" <Michael(dot)J(dot)Tefft(at)snapon(dot)com>, "pgsql-general(at)lists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Autovacuum and visibility maps |
Date: | 2024-12-03 16:57:26 |
Message-ID: | 341dd184-9096-4d1f-a74c-7db02cd1004c@aklaver.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 12/3/24 08:32, Tefft, Michael J wrote:
> We have some batch queries that had occasionally having degraded
> runtimes: from 2 hours degrading to 16 hours, etc.
>
> Comparing plans from good and bad runs, we saw that the good plans used
> index-only scans on table “x”, while the bad plans used index scans.
>
> Using the pg_visibility utility, we found that all of the 83 partitions
> of table “x” were showing zero blocks where all tuples were visible. We
> ran a VACUUM on the table; the visibility maps are now clean and the
> good plans came back.
>
> Our question is: why did autovacuum not spare us from this?
>
> We are using default autovacuum parameters for all except
> log_autovacuum_min_duration=5000. These partitions are populated by
> processes that do a truncate + a single insert-select.
>
> We see autovacuum failure (failed to get lock) messages, followed by a
> success message, in the log for one of these partitions (the biggest
> one) but even that partition showed zero blocks with all tuples visible.
>
> Are we wrong to expect autovacuum to clean up the visibility map?
I have to believe it is due to this:
https://www.postgresql.org/docs/current/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY
"If you have a table whose entire contents are deleted on a periodic
basis, consider doing it with TRUNCATE rather than using DELETE followed
by VACUUM. TRUNCATE removes the entire content of the table immediately,
without requiring a subsequent VACUUM or VACUUM FULL to reclaim the
now-unused disk space. The disadvantage is that strict MVCC semantics
are violated."
Combined with this:
"autovacuum_vacuum_threshold
Specifies the minimum number of updated or deleted tuples needed to
trigger a VACUUM in any one table. ...
"
I'm going to say the TRUNCATE itself does not trigger an autovacuum. I
would suggest throwing a manual VACUUM in the table population script.
>
> postgres=# select version();
>
> version
>
> ----------------------------------------------------------------------------------------------------------
>
> PostgreSQL 14.13 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0
> 20210514 (Red Hat 8.5.0-22), 64-bit
>
> Thank you,
>
> Mike Tefft
>
--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com
From | Date | Subject | |
---|---|---|---|
Next Message | Sasmit Utkarsh | 2024-12-03 17:43:46 | Best Practices for Managing Schema Changes Dynamically with libpq |
Previous Message | Tefft, Michael J | 2024-12-03 16:32:22 | Autovacuum and visibility maps |