From 9fcbe2af11fb966b30117d8ac3c2971d1be14207 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 22 Sep 2004 19:13:52 +0000 Subject: Arrange for hash join to skip scanning the outer relation if it detects that the inner one is completely empty. Per recent discussion. Also some cosmetic cleanups in nearby code. --- src/backend/executor/nodeHash.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/backend/executor/nodeHash.c') diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index c4236f5fcc4..5beb6359a83 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.86 2004/08/29 04:12:31 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.87 2004/09/22 19:13:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -32,8 +32,8 @@ /* ---------------------------------------------------------------- * ExecHash * - * build hash table for hashjoin, all do partitioning if more - * than one batches are required. + * build hash table for hashjoin, doing partitioning if more + * than one batch is required. * ---------------------------------------------------------------- */ TupleTableSlot * @@ -81,6 +81,7 @@ ExecHash(HashState *node) slot = ExecProcNode(outerNode); if (TupIsNull(slot)) break; + hashtable->hashNonEmpty = true; econtext->ecxt_innertuple = slot; ExecHashTableInsert(hashtable, econtext, hashkeys); ExecClearTuple(slot); @@ -189,7 +190,7 @@ ExecEndHash(HashState *node) /* ---------------------------------------------------------------- * ExecHashTableCreate * - * create a hashtable in shared memory for hashjoin. + * create an empty hashtable data structure for hashjoin. * ---------------------------------------------------------------- */ HashJoinTable @@ -226,12 +227,13 @@ ExecHashTableCreate(Hash *node, List *hashOperators) * The hashtable control block is just palloc'd from the executor's * per-query memory context. */ - hashtable = (HashJoinTable) palloc(sizeof(HashTableData)); + hashtable = (HashJoinTable) palloc(sizeof(HashJoinTableData)); hashtable->nbuckets = nbuckets; hashtable->totalbuckets = totalbuckets; hashtable->buckets = NULL; hashtable->nbatch = nbatch; hashtable->curbatch = 0; + hashtable->hashNonEmpty = false; hashtable->innerBatchFile = NULL; hashtable->outerBatchFile = NULL; hashtable->innerBatchSize = NULL; -- cgit v1.2.3