The standard form of VACUUM removes dead row versions in tables and indexes and marks the space available for future reuse. However, it will not return the space to the operating system, except in the special case where one or more pages at the end of a table become entirely free and an exclusive table lock can be easily obtained. In contrast, VACUUM FULL actively compacts tables by writing a complete new version of the table file with no dead space. This minimizes the size of the table, but can take a long time. It also requires extra disk space for the new copy of the table, until the operation completes.
The question is: how can this database state when
one or more pages at the end of a table become entirely free
be achieved? This can be done via VACUUM FULL
, but I haven't got enough space to implement it. So are there any other possibilities?Answer:
To return space to the OS, use
VACUUM FULL
. While being at it, I suppose you run VACUUM FULL ANALYZE
.Bold emphasis mine.FULL
Selects "full" vacuum, which can reclaim more space, but takes much longer and exclusively locks the table. This method also requires extra disk space, since it writes a new copy of the table and doesn't release the old copy until the operation is complete. Usually this should only be used when a significant amount of space needs to be reclaimed from within the table.
CLUSTER
achieves that, too, as a collateral effect.With plain
VACUUM
, you achieve "one or more pages at the
end of a table entirely free" only by chance - the tuples stored last
physically get deleted.This happens, for instance, when you
INSERT
a batch of rows and DELETE
them before other tuples get appended by UPDATE
or INSERT
. or it can happen by chance, if you delete a lot of rows (including those appended last).Disk full
You need wiggle room on your disk for any of these operations. There is also the community toolpg_repack
as replacement for VACUUM FULL
/ CLUSTER
. It avoids exclusive locks, but that, too, needs free space on disk. Quoting the manualRequires free disk space twice as large as the target table(s) and indexes.
To return space to the OS, use
VACUUM FULL . While being at it, I suppose you run VACUUM FULL ANALYZE . I quote the manual:Bold emphasis mine. CLUSTER achieves that, too, as a collateral effect.With plain VACUUM , you achieve "one or more pages at the
end of a table entirely free" only by chance - the tuples stored last
physically get deleted.This happens, for instance, when you INSERT a batch of rows and DELETE them before other tuples get appended by UPDATE or INSERT . or it can happen by chance, if you delete a lot of rows (including those appended last).Disk fullYou need wiggle room on your disk for any of these operations. There is also the community toolpg_repack as replacement for VACUUM FULL / CLUSTER . It avoids exclusive locks, but that, too, needs free space on disk. Quoting the manualRequires free disk space twice as large as the target table(s) and indexes.As a last resort, you can run a dump/restore cycle. That removes all bloat from tables and indexes, too. There is a closely related question here on dba.SE: I need to run VACUUM FULL with no available disk space The answer over there is pretty radical. If your situation allows for it (no foreign keys or other references preventing that you delete rows), you can just:
But maybe you can have that simpler?
|
No comments:
Post a Comment