mirror of
https://github.com/postgres/postgres.git
synced 2025-12-21 05:21:08 +03:00
Use bump memory context for tuplesorts
29f6a959c added a bump allocator type for efficient compact allocations.
Here we make use of this for non-bounded tuplesorts to store tuples.
This is very space efficient when storing narrow tuples due to bump.c
not having chunk headers. This means we can fit more tuples in work_mem
before spilling to disk, or perform an in-memory sort touching fewer
cacheline.
Author: David Rowley
Reviewed-by: Nathan Bossart
Reviewed-by: Matthias van de Meent
Reviewed-by: Tomas Vondra
Reviewed-by: John Naylor
Discussion: https://postgr.es/m/CAApHDvqGSpCU95TmM=Bp=6xjL_nLys4zdZOpfNyWBk97Xrdj2w@mail.gmail.com
This commit is contained in:
@@ -674,6 +674,7 @@ tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot)
|
||||
SortTuple stup;
|
||||
MinimalTuple tuple;
|
||||
HeapTupleData htup;
|
||||
Size tuplen;
|
||||
|
||||
/* copy the tuple into sort storage */
|
||||
tuple = ExecCopySlotMinimalTuple(slot);
|
||||
@@ -686,9 +687,15 @@ tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot)
|
||||
tupDesc,
|
||||
&stup.isnull1);
|
||||
|
||||
/* GetMemoryChunkSpace is not supported for bump contexts */
|
||||
if (TupleSortUseBumpTupleCxt(base->sortopt))
|
||||
tuplen = MAXALIGN(tuple->t_len);
|
||||
else
|
||||
tuplen = GetMemoryChunkSpace(tuple);
|
||||
|
||||
tuplesort_puttuple_common(state, &stup,
|
||||
base->sortKeys->abbrev_converter &&
|
||||
!stup.isnull1);
|
||||
!stup.isnull1, tuplen);
|
||||
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
}
|
||||
@@ -705,6 +712,7 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup)
|
||||
TuplesortPublic *base = TuplesortstateGetPublic(state);
|
||||
MemoryContext oldcontext = MemoryContextSwitchTo(base->tuplecontext);
|
||||
TuplesortClusterArg *arg = (TuplesortClusterArg *) base->arg;
|
||||
Size tuplen;
|
||||
|
||||
/* copy the tuple into sort storage */
|
||||
tup = heap_copytuple(tup);
|
||||
@@ -722,10 +730,16 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup)
|
||||
&stup.isnull1);
|
||||
}
|
||||
|
||||
/* GetMemoryChunkSpace is not supported for bump contexts */
|
||||
if (TupleSortUseBumpTupleCxt(base->sortopt))
|
||||
tuplen = MAXALIGN(HEAPTUPLESIZE + tup->t_len);
|
||||
else
|
||||
tuplen = GetMemoryChunkSpace(tup);
|
||||
|
||||
tuplesort_puttuple_common(state, &stup,
|
||||
base->haveDatum1 &&
|
||||
base->sortKeys->abbrev_converter &&
|
||||
!stup.isnull1);
|
||||
!stup.isnull1, tuplen);
|
||||
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
}
|
||||
@@ -743,6 +757,7 @@ tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel,
|
||||
IndexTuple tuple;
|
||||
TuplesortPublic *base = TuplesortstateGetPublic(state);
|
||||
TuplesortIndexArg *arg = (TuplesortIndexArg *) base->arg;
|
||||
Size tuplen;
|
||||
|
||||
stup.tuple = index_form_tuple_context(RelationGetDescr(rel), values,
|
||||
isnull, base->tuplecontext);
|
||||
@@ -754,10 +769,16 @@ tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel,
|
||||
RelationGetDescr(arg->indexRel),
|
||||
&stup.isnull1);
|
||||
|
||||
/* GetMemoryChunkSpace is not supported for bump contexts */
|
||||
if (TupleSortUseBumpTupleCxt(base->sortopt))
|
||||
tuplen = MAXALIGN(tuple->t_info & INDEX_SIZE_MASK);
|
||||
else
|
||||
tuplen = GetMemoryChunkSpace(tuple);
|
||||
|
||||
tuplesort_puttuple_common(state, &stup,
|
||||
base->sortKeys &&
|
||||
base->sortKeys->abbrev_converter &&
|
||||
!stup.isnull1);
|
||||
!stup.isnull1, tuplen);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -770,6 +791,7 @@ tuplesort_putbrintuple(Tuplesortstate *state, BrinTuple *tuple, Size size)
|
||||
BrinSortTuple *bstup;
|
||||
TuplesortPublic *base = TuplesortstateGetPublic(state);
|
||||
MemoryContext oldcontext = MemoryContextSwitchTo(base->tuplecontext);
|
||||
Size tuplen;
|
||||
|
||||
/* allocate space for the whole BRIN sort tuple */
|
||||
bstup = palloc(BRINSORTTUPLE_SIZE(size));
|
||||
@@ -781,10 +803,16 @@ tuplesort_putbrintuple(Tuplesortstate *state, BrinTuple *tuple, Size size)
|
||||
stup.datum1 = tuple->bt_blkno;
|
||||
stup.isnull1 = false;
|
||||
|
||||
/* GetMemoryChunkSpace is not supported for bump contexts */
|
||||
if (TupleSortUseBumpTupleCxt(base->sortopt))
|
||||
tuplen = MAXALIGN(BRINSORTTUPLE_SIZE(size));
|
||||
else
|
||||
tuplen = GetMemoryChunkSpace(bstup);
|
||||
|
||||
tuplesort_puttuple_common(state, &stup,
|
||||
base->sortKeys &&
|
||||
base->sortKeys->abbrev_converter &&
|
||||
!stup.isnull1);
|
||||
!stup.isnull1, tuplen);
|
||||
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
}
|
||||
@@ -833,7 +861,7 @@ tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull)
|
||||
|
||||
tuplesort_puttuple_common(state, &stup,
|
||||
base->tuples &&
|
||||
base->sortKeys->abbrev_converter && !isNull);
|
||||
base->sortKeys->abbrev_converter && !isNull, 0);
|
||||
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user