Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: postgresql-cfbot/postgresql
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: cf/6196~1
Choose a base ref
...
head repository: postgresql-cfbot/postgresql
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: cf/6196
Choose a head ref
  • 3 commits
  • 16 files changed
  • 2 contributors

Commits on Nov 2, 2025

  1. Improve planner's estimates of tuple hash table sizes.

    For several types of plan nodes that use TupleHashTables, the
    planner estimated the expected size of the table as basically
    numEntries * (MAXALIGN(dataWidth) + MAXALIGN(SizeofHeapTupleHeader)).
    This is pretty far off, especially for small data widths, because
    it doesn't account for the overhead of the simplehash.h hash table
    nor for any per-tuple "additional space" the plan node may request.
    Jeff Janes noted a case where the estimate was off by about a factor
    of three, even though the obvious hazards such as inaccurate estimates
    of numEntries or dataWidth didn't apply.
    
    To improve matters, create functions provided by the relevant executor
    modules that can estimate the required sizes with reasonable accuracy.
    (We're still not accounting for effects like allocator padding, but
    this at least gets the first-order effects correct.)
    
    I added functions that can estimate the tuple table sizes for
    nodeSetOp and nodeSubplan; these rely on an estimator for
    TupleHashTables in general, and that in turn relies on one for
    simplehash.h hash tables.  That feels like kind of a lot of mechanism,
    but if we take any short-cuts we're violating modularity boundaries.
    
    The other places that use TupleHashTables are nodeAgg, which took
    pains to get its numbers right already, and nodeRecursiveunion.
    I did not try to improve the situation for nodeRecursiveunion because
    there's nothing to improve: we are not making an estimate of the hash
    table size, and it wouldn't help us to do so because we have no
    non-hashed alternative implementation.  On top of that, our estimate
    of the number of entries to be hashed in that module is so suspect
    that we'd likely often choose the wrong implementation if we did have
    two ways to do it.
    
    Reported-by: Jeff Janes <jeff.janes@gmail.com>
    Author: Tom Lane <tgl@sss.pgh.pa.us>
    Reviewed-by: David Rowley <dgrowleyml@gmail.com>
    Discussion: https://postgr.es/m/CAMkU=1zia0JfW_QR8L5xA2vpa0oqVuiapm78h=WpNsHH13_9uw@mail.gmail.com
    tglsfdc authored and Commitfest Bot committed Nov 2, 2025
    Configuration menu
    Copy the full SHA
    cfb4770 View commit details
    Browse the repository at this point in the history
  2. Change "long" numGroups fields to be Cardinality (i.e., double).

    We've been nibbling away at removing uses of "long" for a long time,
    since its width is platform-dependent.  Here's one more: change the
    remaining "long" fields in Plan nodes to Cardinality, since the three
    surviving examples all represent group-count estimates.  The upstream
    planner code was converted to Cardinality some time ago; for example
    the corresponding fields in Path nodes are type Cardinality, as are
    the arguments of the make_foo_path functions.  Downstream in the
    executor, it turns out that these all feed to the table-size argument
    of BuildTupleHashTable.  Change that to "double" as well, and fix it
    so that it safely clamps out-of-range values to the uint32 limit of
    simplehash.h, as was not being done before.
    
    Essentially, this is removing all the artificial datatype-dependent
    limitations on these values from upstream processing, and applying
    just one clamp at the moment where we're forced to do so by the
    datatype choices of simplehash.h.
    
    Also, remove BuildTupleHashTable's misguided attempt to enforce
    work_mem/hash_mem_limit.  It doesn't have enough information
    (particularly not the expected tuple width) to do that accurately,
    and it has no real business second-guessing the caller's choice.
    For all these plan types, it's really the planner's responsibility
    to not choose a hashed implementation if the hashtable is expected
    to exceed hash_mem_limit.  The previous patch improved the
    accuracy of those estimates, and even if BuildTupleHashTable had
    more information it should arrive at the same conclusions.
    
    Reported-by: Jeff Janes <jeff.janes@gmail.com>
    Author: Tom Lane <tgl@sss.pgh.pa.us>
    Reviewed-by: David Rowley <dgrowleyml@gmail.com>
    Discussion: https://postgr.es/m/CAMkU=1zia0JfW_QR8L5xA2vpa0oqVuiapm78h=WpNsHH13_9uw@mail.gmail.com
    tglsfdc authored and Commitfest Bot committed Nov 2, 2025
    Configuration menu
    Copy the full SHA
    77dbc88 View commit details
    Browse the repository at this point in the history
  3. [CF 6196] v3 - Improving planner's estimates of TupleHashTable sizes

    This branch was automatically generated by a robot using patches from an
    email thread registered at:
    
    https://commitfest.postgresql.org/patch/6196
    
    The branch will be overwritten each time a new patch version is posted to
    the thread, and also periodically to check for bitrot caused by changes
    on the master branch.
    
    Patch(es): https://www.postgresql.org/message-id/426377.1762100766@sss.pgh.pa.us
    Author(s): Tom Lane
    Commitfest Bot committed Nov 2, 2025
    Configuration menu
    Copy the full SHA
    300bbfe View commit details
    Browse the repository at this point in the history
Loading