mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Before discarding the old hash table in ExecReScanHashJoin, capture its statistics, ensuring that we report the maximum hashtable size across repeated rescans of the hash input relation. We can repurpose the existing code for reporting hashtable size in parallel workers to help with this, making the patch pretty small. This also ensures that if rescans happen within parallel workers, we get the correct maximums across all instances. Konstantin Knizhnik and Tom Lane, per diagnosis by Thomas Munro of a trouble report from Alvaro Herrera. Discussion: https://postgr.es/m/20200323165059.GA24950@alvherre.pgsql
80 lines
3.2 KiB
C
80 lines
3.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* nodeHash.h
|
|
* prototypes for nodeHash.c
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/executor/nodeHash.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef NODEHASH_H
|
|
#define NODEHASH_H
|
|
|
|
#include "access/parallel.h"
|
|
#include "nodes/execnodes.h"
|
|
|
|
struct SharedHashJoinBatch;
|
|
|
|
extern HashState *ExecInitHash(Hash *node, EState *estate, int eflags);
|
|
extern Node *MultiExecHash(HashState *node);
|
|
extern void ExecEndHash(HashState *node);
|
|
extern void ExecReScanHash(HashState *node);
|
|
|
|
extern HashJoinTable ExecHashTableCreate(HashState *state, List *hashOperators, List *hashCollations,
|
|
bool keepNulls);
|
|
extern void ExecParallelHashTableAlloc(HashJoinTable hashtable,
|
|
int batchno);
|
|
extern void ExecHashTableDestroy(HashJoinTable hashtable);
|
|
extern void ExecHashTableDetach(HashJoinTable hashtable);
|
|
extern void ExecHashTableDetachBatch(HashJoinTable hashtable);
|
|
extern void ExecParallelHashTableSetCurrentBatch(HashJoinTable hashtable,
|
|
int batchno);
|
|
|
|
extern void ExecHashTableInsert(HashJoinTable hashtable,
|
|
TupleTableSlot *slot,
|
|
uint32 hashvalue);
|
|
extern void ExecParallelHashTableInsert(HashJoinTable hashtable,
|
|
TupleTableSlot *slot,
|
|
uint32 hashvalue);
|
|
extern void ExecParallelHashTableInsertCurrentBatch(HashJoinTable hashtable,
|
|
TupleTableSlot *slot,
|
|
uint32 hashvalue);
|
|
extern bool ExecHashGetHashValue(HashJoinTable hashtable,
|
|
ExprContext *econtext,
|
|
List *hashkeys,
|
|
bool outer_tuple,
|
|
bool keep_nulls,
|
|
uint32 *hashvalue);
|
|
extern void ExecHashGetBucketAndBatch(HashJoinTable hashtable,
|
|
uint32 hashvalue,
|
|
int *bucketno,
|
|
int *batchno);
|
|
extern bool ExecScanHashBucket(HashJoinState *hjstate, ExprContext *econtext);
|
|
extern bool ExecParallelScanHashBucket(HashJoinState *hjstate, ExprContext *econtext);
|
|
extern void ExecPrepHashTableForUnmatched(HashJoinState *hjstate);
|
|
extern bool ExecScanHashTableForUnmatched(HashJoinState *hjstate,
|
|
ExprContext *econtext);
|
|
extern void ExecHashTableReset(HashJoinTable hashtable);
|
|
extern void ExecHashTableResetMatchFlags(HashJoinTable hashtable);
|
|
extern void ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew,
|
|
bool try_combined_work_mem,
|
|
int parallel_workers,
|
|
size_t *space_allowed,
|
|
int *numbuckets,
|
|
int *numbatches,
|
|
int *num_skew_mcvs);
|
|
extern int ExecHashGetSkewBucket(HashJoinTable hashtable, uint32 hashvalue);
|
|
extern void ExecHashEstimate(HashState *node, ParallelContext *pcxt);
|
|
extern void ExecHashInitializeDSM(HashState *node, ParallelContext *pcxt);
|
|
extern void ExecHashInitializeWorker(HashState *node, ParallelWorkerContext *pwcxt);
|
|
extern void ExecHashRetrieveInstrumentation(HashState *node);
|
|
extern void ExecShutdownHash(HashState *node);
|
|
extern void ExecHashAccumInstrumentation(HashInstrumentation *instrument,
|
|
HashJoinTable hashtable);
|
|
|
|
#endif /* NODEHASH_H */
|