]> granicus.if.org Git - postgresql/commit
Improve memory space management in tuplesort and tuplestore.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 17 Jan 2013 18:12:14 +0000 (13:12 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 17 Jan 2013 18:12:56 +0000 (13:12 -0500)
commit8ae35e91807508872cabd3b0e8db35fc78e194ac
treeba5e9e83911323491021c4068c223a4c036daf2f
parent1296d5c53cad26c775993d6c29e1311919202638
Improve memory space management in tuplesort and tuplestore.

The code originally just doubled the size of the tuple-pointer array so
long as that would fit in allowedMem.  This could result in failing to use
as much as half of allowedMem, if (as is typical) the last doubling attempt
didn't quite fit.  Worse, we might double the array size but be unable to
use most of the added slots, because there was no room left within the
allowedMem limit for tuples the slots should point to.  To fix, double only
so long as we've used less than half of allowedMem in total.  Then do one
more array enlargement, but scale it based on total memory consumption so
far.  This will work nicely as long as the average tuple size is reasonably
stable, and in any case should be better than the old method.

This change will result in large sort operations consuming a larger
fraction of work_mem than they typically did in the past.  The release
notes should mention that users may want to revisit their work_mem
settings, if they'd tuned those settings based on the old behavior of
sorting.

Jeff Janes, reviewed by Peter Geoghegan and Robert Haas
src/backend/utils/sort/tuplesort.c
src/backend/utils/sort/tuplestore.c