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 */
|
/* 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user