mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Use Generation memory contexts to store tuples in sorts
The general usage pattern when we store tuples in tuplesort.c is that we store a series of tuples one by one then either perform a sort or spill them to disk. In the common case, there is no pfreeing of already stored tuples. For the common case since we do not individually pfree tuples, we have very little need for aset.c memory allocation behavior which maintains freelists and always rounds allocation sizes up to the next power of 2 size. Here we conditionally use generation.c contexts for storing tuples in tuplesort.c when the sort will never be bounded. Unfortunately, the memory context to store tuples is already created by the time any calls would be made to tuplesort_set_bound(), so here we add a new sort option that allows callers to specify if they're going to need a bounded sort or not. We'll use a standard aset.c allocator when this sort option is not set. Extension authors must ensure that the TUPLESORT_ALLOWBOUNDED flag is used when calling tuplesort_begin_* for any sorts that make a call to tuplesort_set_bound(). Author: David Rowley Reviewed-by: Andy Fan Discussion: https://postgr.es/m/CAApHDvoH4ASzsAOyHcxkuY01Qf++8JJ0paw+03dk+W25tQEcNQ@mail.gmail.com
This commit is contained in:
@ -315,7 +315,7 @@ switchToPresortedPrefixMode(PlanState *pstate)
|
||||
&(plannode->sort.nullsFirst[nPresortedCols]),
|
||||
work_mem,
|
||||
NULL,
|
||||
TUPLESORT_NONE);
|
||||
node->bounded ? TUPLESORT_ALLOWBOUNDED : TUPLESORT_NONE);
|
||||
node->prefixsort_state = prefixsort_state;
|
||||
}
|
||||
else
|
||||
@ -616,6 +616,8 @@ ExecIncrementalSort(PlanState *pstate)
|
||||
plannode->sort.nullsFirst,
|
||||
work_mem,
|
||||
NULL,
|
||||
node->bounded ?
|
||||
TUPLESORT_ALLOWBOUNDED :
|
||||
TUPLESORT_NONE);
|
||||
node->fullsort_state = fullsort_state;
|
||||
}
|
||||
|
@ -99,6 +99,8 @@ ExecSort(PlanState *pstate)
|
||||
|
||||
if (node->randomAccess)
|
||||
tuplesortopts |= TUPLESORT_RANDOMACCESS;
|
||||
if (node->bounded)
|
||||
tuplesortopts |= TUPLESORT_ALLOWBOUNDED;
|
||||
|
||||
if (node->datumSort)
|
||||
tuplesortstate = tuplesort_begin_datum(TupleDescAttr(tupDesc, 0)->atttypid,
|
||||
|
Reference in New Issue
Block a user