diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2007-09-24 03:53:02 +0000 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2007-09-24 03:53:02 +0000 |
commit | 189f9a5bb2c7490c98e7a84ade9e20c85e9003e2 (patch) | |
tree | e4bb4dceb00108ab5e86592cc991ed7170e4976e | |
parent | a4f72d59405f22a851d827a7a8d031863c3b2be3 (diff) | |
download | postgresql-189f9a5bb2c7490c98e7a84ade9e20c85e9003e2.tar.gz |
Reduce the size of memory allocations by lazy vacuum when processing a small
table, by allocating just enough for a hardcoded number of dead tuples per
page. The current estimate is 200 dead tuples per page.
Per reports from Jeff Amiel, Erik Jones and Marko Kreen, and subsequent
discussion.
CVS: ----------------------------------------------------------------------
CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS: commands/vacuumlazy.c
CVS: ----------------------------------------------------------------------
-rw-r--r-- | src/backend/commands/vacuumlazy.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 04494a5774..c4bf719ceb 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -11,10 +11,12 @@ * on the number of tuples and pages we will keep track of at once. * * We are willing to use at most maintenance_work_mem memory space to keep - * track of dead tuples. We initially allocate an array of TIDs of that size. - * If the array threatens to overflow, we suspend the heap scan phase and - * perform a pass of index cleanup and page compaction, then resume the heap - * scan with an empty TID array. + * track of dead tuples. We initially allocate an array of TIDs of that size, + * with an upper limit that depends on table size (this limit ensures we don't + * allocate a huge area uselessly for vacuuming small tables). If the array + * threatens to overflow, we suspend the heap scan phase and perform a pass of + * index cleanup and page compaction, then resume the heap scan with an empty + * TID array. * * We can limit the storage for page free space to MaxFSMPages entries, * since that's the most the free space map will be willing to remember @@ -36,7 +38,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.81.2.3 2007/09/16 02:37:54 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.81.2.4 2007/09/24 03:53:02 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -66,6 +68,12 @@ #define REL_TRUNCATE_MINIMUM 1000 #define REL_TRUNCATE_FRACTION 16 +/* + * Guesstimation of number of dead tuples per page. This is used to + * provide an upper limit to memory allocated when vacuuming small + * tables. + */ +#define LAZY_ALLOC_TUPLES 200 typedef struct LVRelStats { @@ -903,6 +911,11 @@ lazy_space_alloc(LVRelStats *vacrelstats, BlockNumber relblocks) maxtuples = (maintenance_work_mem * 1024L) / sizeof(ItemPointerData); maxtuples = Min(maxtuples, INT_MAX); maxtuples = Min(maxtuples, MaxAllocSize / sizeof(ItemPointerData)); + + /* curious coding here to ensure the multiplication can't overflow */ + if ((BlockNumber) (maxtuples / LAZY_ALLOC_TUPLES) > relblocks) + maxtuples = relblocks * LAZY_ALLOC_TUPLES; + /* stay sane if small maintenance_work_mem */ maxtuples = Max(maxtuples, MaxHeapTuplesPerPage); } |