pgsql: Add options to control whether VACUUM runs vac_update_datfrozenx

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Add options to control whether VACUUM runs vac_update_datfrozenx
Date: 2023-01-06 19:17:32
Message-ID: E1pDsDb-002N8D-ML@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Add options to control whether VACUUM runs vac_update_datfrozenxid.

VACUUM normally ends by running vac_update_datfrozenxid(), which
requires a scan of pg_class. Therefore, if one attempts to vacuum a
database one table at a time --- as vacuumdb has done since v12 ---
we will spend O(N^2) time in vac_update_datfrozenxid(). That causes
serious performance problems in databases with tens of thousands of
tables, and indeed the effect is measurable with only a few hundred.
To add insult to injury, only one process can run
vac_update_datfrozenxid at the same time per DB, so this behavior
largely defeats vacuumdb's -j option.

Hence, invent options SKIP_DATABASE_STATS and ONLY_DATABASE_STATS
to allow applications to postpone vac_update_datfrozenxid() until the
end of a series of VACUUM requests, and teach vacuumdb to use them.

Per bug #17717 from Gunnar L. Sadly, this answer doesn't seem
like something we'd consider back-patching, so the performance
problem will remain in v12-v15.

Tom Lane and Nathan Bossart

Discussion: https://postgr.es/m/17717-6c50eb1c7d23a886@postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/a46a7011b27188af526047a111969f257aaf4db8

Modified Files
--------------
doc/src/sgml/ref/vacuum.sgml | 37 +++++++++++++++++++++++++++++++
src/backend/commands/vacuum.c | 42 +++++++++++++++++++++++++++++++-----
src/backend/postmaster/autovacuum.c | 9 ++++++--
src/bin/psql/tab-complete.c | 5 +++--
src/bin/scripts/t/100_vacuumdb.pl | 24 ++++++++++-----------
src/bin/scripts/vacuumdb.c | 33 ++++++++++++++++++++++++++++
src/fe_utils/parallel_slot.c | 3 +++
src/include/commands/vacuum.h | 2 ++
src/test/regress/expected/vacuum.out | 6 ++++++
src/test/regress/sql/vacuum.sql | 7 ++++++
10 files changed, 147 insertions(+), 21 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Andrew Dunstan 2023-01-06 21:06:02 pgsql: Allow hyphens in ltree labels
Previous Message Peter Geoghegan 2023-01-06 19:16:00 Re: pgsql: Delay commit status checks until freezing executes.