Re: Autovacuum and visibility maps
От | Adrian Klaver |
---|---|
Тема | Re: Autovacuum and visibility maps |
Дата | |
Msg-id | 341dd184-9096-4d1f-a74c-7db02cd1004c@aklaver.com обсуждение исходный текст |
Ответ на | Autovacuum and visibility maps ("Tefft, Michael J" <Michael.J.Tefft@snapon.com>) |
Ответы |
Re: Autovacuum and visibility maps
RE: Autovacuum and visibility maps |
Список | 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: https://www.postgresql.org/docs/current/runtime-config-autovacuum.html#GUC-AUTOVACUUM-VACUUM-INSERT-THRESHOLD "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.klaver@aklaver.com
В списке pgsql-general по дате отправления: