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:
Jeff Davis 2020-04-03 19:52:16 -07:00
parent 3e0d80fd8d
commit 0588ee63aa
2 changed files with 31 additions and 7 deletions

View File

@ -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;
}
/*

View File

@ -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,