Re: Memory-Bounded Hash Aggregation
Jeff Davis <pgsql@j-davis.com>
Attachments
- hashagg-20200124.patch (text/x-patch) patch
On Wed, 2020-01-08 at 12:38 +0200, Heikki Linnakangas wrote: > This makes the assumption that all Aggrefs or GroupingFuncs are at > the > top of the TargetEntry. That's not true, e.g.: > > select 0+sum(a) from foo group by b; > > I think find_aggregated_cols() and find_unaggregated_cols() should > be > merged into one function that scans the targetlist once, and returns > two > Bitmapsets. They're always used together, anyway. I cut the projection out for now, because there's some work in that area in another thread[1]. If that work doesn't pan out, I can reintroduce the projection logic to this one. New patch attached. It now uses logtape.c (thanks Adam for prototyping this work) instead of buffile.c. This gives better control over the number of files and the memory consumed for buffers, and reduces waste. It requires two changes to logtape.c though: * add API to extend the number of tapes * lazily allocate buffers for reading (buffers for writing were already allocated lazily) so that the total number of buffers needed at any time is bounded Unfortunately, I'm seeing some bad behavior (at least in some cases) with logtape.c, where it's spending a lot of time qsorting the list of free blocks. Adam, did you also see this during your perf tests? It seems to be worst with lower work_mem settings and a large number of input groups (perhaps there are just too many small tapes?). It also has some pretty major refactoring that hopefully makes it simpler to understand and reason about, and hopefully I didn't introduce too many bugs/regressions. A list of other changes: * added test that involves rescan * tweaked some details and tunables so that I think memory usage tracking and reporting (EXPLAIN ANALYZE) is better, especially for smaller work_mem * simplified quite a few function signatures Regards, Jeff Davis [1] https://postgr.es/m/CAAKRu_Yj=Q_ZxiGX+pgstNWMbUJApEJX-imvAEwryCk5SLUebg@mail.gmail.com
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