Re: Memory-Bounded Hash Aggregation
Jeff Davis <pgsql@j-davis.com>
Attachments
- logtape.patch (text/x-patch) patch
On Wed, 2020-01-29 at 14:48 -0800, Jeff Davis wrote: > 2) Use a different structure more capable of handling a large > fraction > of free space. A compressed bitmap might make sense, but that seems > like overkill to waste effort tracking a lot of space that is > unlikely > to ever be used. I ended up converting the freelist to a min heap. Attached is a patch which makes three changes to better support HashAgg: 1. Use a minheap for the freelist. The original design used an array that had to be sorted between a read (which frees a block) and a write (which needs to sort the array to consume the lowest block number). The comments said: * sorted. This is an efficient way to handle it because we expect cycles * of releasing many blocks followed by re-using many blocks, due to * the larger read buffer. But I didn't find a case where that actually wins over a simple minheap. With that in mind, a minheap seems closer to what one might expect for that purpose, and more robust when the assumptions don't hold up as well. If someone knows of a case where the re-sorting behavior is important, please let me know. Changing to a minheap effectively solves the problem for HashAgg, though in theory the memory consumption of the freelist itself could become significant (though it's only 0.1% of the free space being tracked). 2. Lazily-allocate the read buffer. The write buffer was always lazily- allocated, so this patch creates better symmetry. More importantly, it means freshly-rewound tapes don't have any buffer allocated, so it greatly expands the number of tapes that can be managed efficiently as long as only a limited number are active at once. 3. Allow expanding the number of tapes for an existing tape set. This is useful for HashAgg, which doesn't know how many tapes will be needed in advance. Regards, Jeff Davis
Commits
-
Fix costing for disk-based hash aggregation.
- 7351bfeda33b 13.0 landed
-
Fixes for Disk-based Hash Aggregation.
- 64fe60227909 13.0 landed
-
Disk-based Hash Aggregation.
- 1f39bce02154 13.0 landed
-
Extend ExecBuildAggTrans() to support a NULL pointer check.
- c954d4904650 13.0 landed
-
Save calculated transitionSpace in Agg node.
- c11cb17dc55a 13.0 landed
-
Minor refactor of nodeAgg.c.
- 5b618e1f48ae 13.0 landed
-
Logical Tape Set: lazily allocate read buffer.
- 7fdd919ae755 13.0 landed
-
Introduce TupleHashTableHash() and LookupTupleHashEntryHash().
- 4eaea3db150a 13.0 landed
-
Logical Tape Set: use min heap for freelist.
- c02fdc922301 13.0 landed
-
Fix comments in execGrouping.c
- 30d47723fd15 13.0 landed
-
Avoid integer overflow while sifting-up a heap in tuplesort.c.
- 512f67c8d02c 10.0 cited
-
Make the overflow guards in ExecChooseHashTableSize be more protective.
- 8442317beb8f 9.0.0 cited
-
Improve performance of our private version of qsort. Per recent testing,
- a3f0b3d68f9a 8.2.0 cited