Include chunk overhead in hash table entry size estimate.
Don't try to be precise about it, just use a constant 16 bytes of chunk overhead. Being smarter would require knowing the memory context where the chunk will be allocated, which is not known by all callers. Discussion: https://postgr.es/m/20200325220936.il3ni2fj2j2b45y5@alap3.anarazel.de
This commit is contained in:
parent
3e0d80fd8d
commit
0588ee63aa
@ -297,6 +297,12 @@
|
||||
/* minimum number of initial hash table buckets */
|
||||
#define HASHAGG_MIN_BUCKETS 256
|
||||
|
||||
/*
|
||||
* Estimate chunk overhead as a constant 16 bytes. XXX: should this be
|
||||
* improved?
|
||||
*/
|
||||
#define CHUNKHDRSZ 16
|
||||
|
||||
/*
|
||||
* Track all tapes needed for a HashAgg that spills. We don't know the maximum
|
||||
* number of tapes needed at the start of the algorithm (because it can
|
||||
@ -1639,14 +1645,32 @@ find_hash_columns(AggState *aggstate)
|
||||
* Estimate per-hash-table-entry overhead.
|
||||
*/
|
||||
Size
|
||||
hash_agg_entry_size(int numAggs, Size tupleWidth, Size transitionSpace)
|
||||
hash_agg_entry_size(int numTrans, Size tupleWidth, Size transitionSpace)
|
||||
{
|
||||
Size tupleChunkSize;
|
||||
Size pergroupChunkSize;
|
||||
Size transitionChunkSize;
|
||||
Size tupleSize = (MAXALIGN(SizeofMinimalTupleHeader) +
|
||||
tupleWidth);
|
||||
Size pergroupSize = numTrans * sizeof(AggStatePerGroupData);
|
||||
|
||||
tupleChunkSize = CHUNKHDRSZ + tupleSize;
|
||||
|
||||
if (pergroupSize > 0)
|
||||
pergroupChunkSize = CHUNKHDRSZ + pergroupSize;
|
||||
else
|
||||
pergroupChunkSize = 0;
|
||||
|
||||
if (transitionSpace > 0)
|
||||
transitionChunkSize = CHUNKHDRSZ + transitionSpace;
|
||||
else
|
||||
transitionChunkSize = 0;
|
||||
|
||||
return
|
||||
MAXALIGN(SizeofMinimalTupleHeader) +
|
||||
MAXALIGN(tupleWidth) +
|
||||
MAXALIGN(sizeof(TupleHashEntryData) +
|
||||
numAggs * sizeof(AggStatePerGroupData)) +
|
||||
transitionSpace;
|
||||
sizeof(TupleHashEntryData) +
|
||||
tupleChunkSize +
|
||||
pergroupChunkSize +
|
||||
transitionChunkSize;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -314,7 +314,7 @@ extern AggState *ExecInitAgg(Agg *node, EState *estate, int eflags);
|
||||
extern void ExecEndAgg(AggState *node);
|
||||
extern void ExecReScanAgg(AggState *node);
|
||||
|
||||
extern Size hash_agg_entry_size(int numAggs, Size tupleWidth,
|
||||
extern Size hash_agg_entry_size(int numTrans, Size tupleWidth,
|
||||
Size transitionSpace);
|
||||
extern void hash_agg_set_limits(double hashentrysize, uint64 input_groups,
|
||||
int used_bits, Size *mem_limit,
|
||||
|
Loading…
x
Reference in New Issue
Block a user