public inbox for [email protected]  
help / color / mirror / Atom feed
From: Adrian Klaver <[email protected]>
To: Tefft, Michael J <[email protected]>
To: [email protected] <[email protected]>
Subject: Re: Autovacuum and visibility maps
Date: Tue, 3 Dec 2024 08:57:26 -0800
Message-ID: <[email protected]> (raw)
In-Reply-To: <BN8PR04MB6289F7099F7B38E5B08D85B7D0362@BN8PR04MB6289.namprd04.prod.outlook.com>
References: <BN8PR04MB6289F7099F7B38E5B08D85B7D0362@BN8PR04MB6289.namprd04.prod.outlook.com>

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:

https://www.postgresql.org/docs/current/runtime-config-autovacuum.html#GUC-AUTOVACUUM-VACUUM-INSERT-...

"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
[email protected]







view thread (3+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected]
  Subject: Re: Autovacuum and visibility maps
  In-Reply-To: <[email protected]>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox