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 */ /* minimum number of initial hash table buckets */
#define HASHAGG_MIN_BUCKETS 256 #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 * 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 * 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. * Estimate per-hash-table-entry overhead.
*/ */
Size 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 return
MAXALIGN(SizeofMinimalTupleHeader) + sizeof(TupleHashEntryData) +
MAXALIGN(tupleWidth) + tupleChunkSize +
MAXALIGN(sizeof(TupleHashEntryData) + pergroupChunkSize +
numAggs * sizeof(AggStatePerGroupData)) + transitionChunkSize;
transitionSpace;
} }
/* /*

View File

@ -314,7 +314,7 @@ extern AggState *ExecInitAgg(Agg *node, EState *estate, int eflags);
extern void ExecEndAgg(AggState *node); extern void ExecEndAgg(AggState *node);
extern void ExecReScanAgg(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); Size transitionSpace);
extern void hash_agg_set_limits(double hashentrysize, uint64 input_groups, extern void hash_agg_set_limits(double hashentrysize, uint64 input_groups,
int used_bits, Size *mem_limit, int used_bits, Size *mem_limit,