mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
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:
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user