Re: Memory-Bounded Hash Aggregation
Jeff Davis <pgsql@j-davis.com>
On Wed, 2019-12-04 at 19:50 -0800, Adam Lee wrote: > On Wed, Dec 04, 2019 at 06:55:43PM -0800, Jeff Davis wrote: > > > > Thanks very much for a great review! I've attached a new patch. > > Hi, > > About the `TODO: project needed attributes only` in your patch, when > would the input tuple contain columns not needed? It seems like > anything > you can project has to be in the group or aggregates. If you have a table like: CREATE TABLE foo(i int, j int, x int, y int, z int); And do: SELECT i, SUM(j) FROM foo GROUP BY i; At least from a logical standpoint, you might expect that we project only the attributes we need from foo before feeding them into the HashAgg. But that's not quite how postgres works. Instead, it leaves the tuples intact (which, in this case, means they have 5 attributes) until after aggregation and lazily fetches whatever attributes are referenced. Tuples are spilled from the input, at which time they still have 5 attributes; so naively copying them is wasteful. I'm not sure how often this laziness is really a win in practice, especially after the expression evaluation has changed so much in recent releases. So it might be better to just project all the attributes eagerly, and then none of this would be a problem. If we still wanted to be lazy about attribute fetching, that should still be possible even if we did a kind of "logical" projection of the tuple so that the useless attributes would not be relevant. Regardless, that's outside the scope of the patch I'm currently working on. What I'd like to do is copy just the attributes needed into a new virtual slot, leave the unneeded ones NULL, and then write it out to the tuplestore as a MinimalTuple. I just need to be sure to get the right attributes. 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