Re: reloption to prevent VACUUM from truncating empty pages at the end of relation
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Fujii Masao <masao.fujii@gmail.com>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2018-04-17T18:09:53Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Add TRUNCATE parameter to VACUUM.
- b84dbc8eb80b 12.0 landed
-
Add vacuum_truncate reloption.
- 119dcfad988d 12.0 landed
-
Allow VACUUM to be run with index cleanup disabled.
- a96c41feec6b 12.0 cited
Fujii Masao <masao.fujii@gmail.com> writes: > When VACUUM tries to truncate the trailing empty pages, it scans shared_buffers > to invalidate the pages-to-truncate during holding an AccessExclusive lock on > the relation. So if shared_buffers is huge, other transactions need to wait for > a very long time before accessing to the relation. Which would cause the > response-time spikes, for example, I observed such spikes several times on > the server with shared_buffers = 300GB while running the benchmark. > Therefore, I'm thinking to propose $SUBJECT and enable it to avoid such spikes > for that relation. I think that the real problem here is having to do a scan of all of shared buffers. VACUUM's not the only thing that has to do that, there's also e.g. DROP and TRUNCATE. So rather than a klugy solution that only fixes VACUUM (and not very well, requiring user intervention and an unpleasant tradeoff), we ought to look at ways to avoid needing a whole-pool scan to find the pages belonging to one relation. In the past we've been able to skate by without a decent solution for that because shared buffers were customarily not all that big. But if we're going to start considering huge buffer pools to be a case we want to have good performance for, that's got to change. regards, tom lane