Re: Default setting for enable_hashagg_disk
Jeff Davis <pgsql@j-davis.com>
From: Jeff Davis <pgsql@j-davis.com>
To: Robert Haas <robertmhaas@gmail.com>, Andres Freund <andres@anarazel.de>
Cc: David Rowley <dgrowleyml@gmail.com>, Justin Pryzby
<pryzby@telsasoft.com>, Melanie Plageman <melanieplageman@gmail.com>,
Tomas Vondra <tomas.vondra@2ndquadrant.com>,
"pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2020-06-25T16:14:56Z
Lists: pgsql-hackers, pgsql-docs
On Wed, 2020-06-24 at 15:28 -0400, Robert Haas wrote: > On Wed, Jun 24, 2020 at 3:14 PM Andres Freund <andres@anarazel.de> > wrote: > > FWIW, my gut feeling is that we'll end up have to separate the > > "execution time" spilling from using plain work mem, because it'll > > trigger spilling too often. E.g. if the plan isn't expected to > > spill, > > only spill at 10 x work_mem or something like that. Or we'll need > > better management of temp file data when there's plenty memory > > available. ... > I think that's actually pretty appealing. Separating the memory we > plan to use from the memory we're willing to use before spilling > seems > like a good idea in general, and I think we should probably also do > it > in other places - like sorts. I'm trying to make sense of this. Let's say there are two GUCs: planner_work_mem=16MB and executor_work_mem=32MB. And let's say a query comes along and generates a HashAgg path, and the planner (correctly) thinks if you put all the groups in memory at once, it would be 24MB. Then the planner, using planner_work_mem, would think spilling was necessary, and generate a cost that involves spilling. Then it's going to generate a Sort+Group path, as well. And perhaps it estimates that sorting all of the tuples in memory would also take 24MB, so it generates a cost that involves spilling to disk. But it has to choose one of them. We've penalized plans at risk of spilling to disk, but what's the point? The planner needs to choose one of them, and both are at risk of spilling to disk. Regards, Jeff Davis
Commits
-
Add hash_mem_multiplier GUC.
- d6c08e29e7bc 14.0 landed
- 78530c8e7a5a 13.0 landed
-
HashAgg: use better cardinality estimate for recursive spilling.
- 3a232a3183d5 13.0 landed
- 9878b643f37b 14.0 landed
-
Remove hashagg_avoid_disk_plan GUC.
- bcbf9446a298 14.0 landed
- 5a6cc6ffa914 13.0 landed
-
Doc fixup for hashagg_avoid_disk_plan GUC.
- d33f33539d7f 13.0 landed
- 7ce461560159 14.0 landed
-
Rework HashAgg GUCs.
- 13e0fa7ae50c 13.0 landed
- 92c58fd94801 14.0 landed
-
Disk-based Hash Aggregation.
- 1f39bce02154 13.0 cited
-
Implement partition-wise grouping/aggregation.
- e2f1eb0ee30d 11.0 cited
-
Defer creation of partially-grouped relation until it's needed.
- 4f15e5d09de2 11.0 cited