Re: Memory-Bounded Hash Aggregation
Jeff Davis <pgsql@j-davis.com>
On Fri, 2019-08-02 at 14:44 +0800, Adam Lee wrote: > I'm late to the party. You are welcome to join any time! > These two approaches both spill the input tuples, what if the skewed > groups are not encountered before the hash table fills up? The spill > files' size and disk I/O could be downsides. Let's say the worst case is that we encounter 10 million groups of size one first; just enough to fill up memory. Then, we encounter a single additional group of size 20 million, and need to write out all of those 20 million raw tuples. That's still not worse than Sort+GroupAgg which would need to write out all 30 million raw tuples (in practice Sort is pretty fast so may still win in some cases, but not by any huge amount). > Greenplum spills all the groups by writing the partial aggregate > states, > reset the memory context, process incoming tuples and build in-memory > hash table, then reload and combine the spilled partial states at > last, > how does this sound? That can be done as an add-on to approach #1 by evicting the entire hash table (writing out the partial states), then resetting the memory context. It does add to the complexity though, and would only work for the aggregates that support serializing and combining partial states. It also might be a net loss to do the extra work of initializing and evicting a partial state if we don't have large enough groups to benefit. Given that the worst case isn't worse than Sort+GroupAgg, I think it should be left as a future optimization. That would give us time to tune the process to work well in a variety of cases. 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