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/include | |
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/include')
-rw-r--r-- | src/include/executor/executor.h | 2 | ||||
-rw-r--r-- | src/include/nodes/execnodes.h | 32 |
2 files changed, 20 insertions, 14 deletions
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 39521ed08e3..136276be53c 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -140,7 +140,7 @@ extern void execTuplesHashPrepare(int numCols, extern TupleHashTable BuildTupleHashTable(int numCols, AttrNumber *keyColIdx, FmgrInfo *eqfunctions, FmgrInfo *hashfunctions, - long nbuckets, Size entrysize, + long nbuckets, Size additionalsize, MemoryContext tablecxt, MemoryContext tempcxt); extern TupleHashEntry LookupTupleHashEntry(TupleHashTable hashtable, diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 4fa366178f5..f6f73f3c590 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -499,14 +499,23 @@ typedef struct TupleHashTableData *TupleHashTable; typedef struct TupleHashEntryData { - /* firstTuple must be the first field in this struct! */ MinimalTuple firstTuple; /* copy of first tuple in this group */ - /* there may be additional data beyond the end of this struct */ -} TupleHashEntryData; /* VARIABLE LENGTH STRUCT */ + void *additional; /* user data */ + uint32 status; /* hash status */ + uint32 hash; /* hash value (cached) */ +} TupleHashEntryData; + +/* define paramters necessary to generate the tuple hash table interface */ +#define SH_PREFIX tuplehash +#define SH_ELEMENT_TYPE TupleHashEntryData +#define SH_KEY_TYPE MinimalTuple +#define SH_SCOPE extern +#define SH_DECLARE +#include "lib/simplehash.h" typedef struct TupleHashTableData { - HTAB *hashtab; /* underlying dynahash table */ + tuplehash_hash *hashtab; /* underlying hash table */ int numCols; /* number of columns in lookup key */ AttrNumber *keyColIdx; /* attr numbers of key columns */ FmgrInfo *tab_hash_funcs; /* hash functions for table datatype(s) */ @@ -521,7 +530,7 @@ typedef struct TupleHashTableData FmgrInfo *cur_eq_funcs; /* equality functions for input vs. table */ } TupleHashTableData; -typedef HASH_SEQ_STATUS TupleHashIterator; +typedef tuplehash_iterator TupleHashIterator; /* * Use InitTupleHashIterator/TermTupleHashIterator for a read/write scan. @@ -529,16 +538,13 @@ typedef HASH_SEQ_STATUS TupleHashIterator; * explicit scan termination is needed). */ #define InitTupleHashIterator(htable, iter) \ - hash_seq_init(iter, (htable)->hashtab) + tuplehash_start_iterate(htable->hashtab, iter) #define TermTupleHashIterator(iter) \ - hash_seq_term(iter) + ((void) 0) #define ResetTupleHashIterator(htable, iter) \ - do { \ - hash_freeze((htable)->hashtab); \ - hash_seq_init(iter, (htable)->hashtab); \ - } while (0) -#define ScanTupleHashTable(iter) \ - ((TupleHashEntry) hash_seq_search(iter)) + InitTupleHashIterator(htable, iter) +#define ScanTupleHashTable(htable, iter) \ + tuplehash_iterate(htable->hashtab, iter) /* ---------------------------------------------------------------- |