Re: Default setting for enable_hashagg_disk (hash_mem)
Justin Pryzby <pryzby@telsasoft.com>
From: Justin Pryzby <pryzby@telsasoft.com>
To: Peter Geoghegan <pg@bowt.ie>
Cc: Tomas Vondra <tomas.vondra@2ndquadrant.com>, Bruce Momjian <bruce@momjian.us>, Robert Haas <robertmhaas@gmail.com>, Andres Freund <andres@anarazel.de>, David Rowley <dgrowleyml@gmail.com>, Jeff Davis <pgsql@j-davis.com>, Melanie Plageman <melanieplageman@gmail.com>, pgsql-hackers@postgresql.org
Date: 2020-07-03T02:46:49Z
Lists: pgsql-hackers, pgsql-docs
On Thu, Jul 02, 2020 at 07:05:48PM -0700, Peter Geoghegan wrote: > On Mon, Jun 29, 2020 at 2:46 PM Peter Geoghegan <pg@bowt.ie> wrote: > > On Mon, Jun 29, 2020 at 2:22 PM Tomas Vondra <tomas.vondra@2ndquadrant.com> wrote: > > > I agree with this, and I'm mostly OK with having hash_mem. In fact, from > > > the proposals in this thread I like it the most - as long as it's used > > > both during planning and execution. It's a pretty clear solution. > > > > Great. > > > > It's not trivial to write the patch, since there are a few tricky > > cases. For example, maybe there is some subtlety in nodeAgg.c with > > AGG_MIXED cases. > > Attached is an attempt at this. I have not been particularly thorough, Thanks for putting it together, I agree that hash_mem seems to be an obvious "escape hatch" that generalizes existing GUCs and independently useful. > anything else). I still think that the new GUC should work as a > multiplier of work_mem, or something else along those lines, though > for now it's just an independent work_mem used for hashing. I bring it > up again because I'm concerned about users that upgrade to Postgres 13 > incautiously, and find that hashing uses *less* memory than before. > Many users probably get away with setting work_mem quite high across > the board. At the very least, hash_mem should be ignored when it's set > to below work_mem (which isn't what the patch does). I feel it should same as work_mem, as it's written, and not a multiplier. And actually I don't think a lower value should be ignored: "mechanism not policy". Do we refuse atypical values of maintenance_work_mem < work_mem ? I assumed that hash_mem would default to -1, which would mean "fall back to work_mem". We'd then advise users to increase it if they have an issue in v13 with performance of hashes spilled to disk. (And maybe in other cases, too.) I read the argument that hash tables are a better use of RAM than sort. However it seems like setting the default to greater than work_mem is a separate change than providing the mechanism allowing user to do so. I guess the change in default is intended to mitigate the worst possible behavior change someone might experience in v13 hashing, and might be expected to improve "out of the box" performance. I'm not opposed to it, but it's not an essential part of the patch. In nodeHash.c, you missed an underscore: + * Target in-memory hashtable size is hashmem kilobytes. -- Justin
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