diff options
author | Andres Freund <andres@anarazel.de> | 2016-10-14 17:22:51 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2016-10-14 17:22:51 -0700 |
commit | 5dfc198146b49ce7ecc8a1fc9d5e171fb75f6ba5 (patch) | |
tree | f861a4967ebd60a0cba6b2047255f739361e2c6c /src/backend/optimizer/plan/planner.c | |
parent | 75ae538bc3168bf44475240d4e0487ee2f3bb376 (diff) | |
download | postgresql-5dfc198146b49ce7ecc8a1fc9d5e171fb75f6ba5.tar.gz postgresql-5dfc198146b49ce7ecc8a1fc9d5e171fb75f6ba5.zip |
Use more efficient hashtable for execGrouping.c to speed up hash aggregation.
The more efficient hashtable speeds up hash-aggregations with more than
a few hundred groups significantly. Improvements of over 120% have been
measured.
Due to the the different hash table queries that not fully
determined (e.g. GROUP BY without ORDER BY) may change their result
order.
The conversion is largely straight-forward, except that, due to the
static element types of simplehash.h type hashes, the additional data
some users store in elements (e.g. the per-group working data for hash
aggregaters) is now stored in TupleHashEntryData->additional. The
meaning of BuildTupleHashTable's entrysize (renamed to additionalsize)
has been changed to only be about the additionally stored size. That
size is only used for the initial sizing of the hash-table.
Reviewed-By: Tomas Vondra
Discussion: <20160727004333.r3e2k2y6fvk2ntup@alap3.anarazel.de>
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index f657ffc4463..644b8b6763d 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -3292,6 +3292,12 @@ estimate_hashagg_tablesize(Path *path, const AggClauseCosts *agg_costs, /* plus the per-hash-entry overhead */ hashentrysize += hash_agg_entry_size(agg_costs->numAggs); + /* + * Note that this disregards the effect of fill-factor and growth policy + * of the hash-table. That's probably ok, given default the default + * fill-factor is relatively high. It'd be hard to meaningfully factor in + * "double-in-size" growth policies here. + */ return hashentrysize * dNumGroups; } |