mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
Avoid copying index tuples when building an index.
The previous code, perhaps out of concern for avoid memory leaks, formed the tuple in one memory context and then copied it to another memory context. However, this doesn't appear to be necessary, since index_form_tuple and the functions it calls take precautions against leaking memory. In my testing, building the tuple directly inside the sort context shaves several percent off the index build time. Rearrange things so we do that. Patch by me. Review by Amit Kapila, Tom Lane, Andres Freund.
This commit is contained in:
@@ -1134,22 +1134,25 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup)
|
||||
}
|
||||
|
||||
/*
|
||||
* Accept one index tuple while collecting input data for sort.
|
||||
*
|
||||
* Note that the input tuple is always copied; the caller need not save it.
|
||||
* Collect one index tuple while collecting input data for sort, building
|
||||
* it from caller-supplied values.
|
||||
*/
|
||||
void
|
||||
tuplesort_putindextuple(Tuplesortstate *state, IndexTuple tuple)
|
||||
tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel,
|
||||
ItemPointer self, Datum *values,
|
||||
bool *isnull)
|
||||
{
|
||||
MemoryContext oldcontext = MemoryContextSwitchTo(state->sortcontext);
|
||||
SortTuple stup;
|
||||
|
||||
/*
|
||||
* Copy the given tuple into memory we control, and decrease availMem.
|
||||
* Then call the common code.
|
||||
*/
|
||||
COPYTUP(state, &stup, (void *) tuple);
|
||||
|
||||
stup.tuple = index_form_tuple(RelationGetDescr(rel), values, isnull);
|
||||
((IndexTuple) stup.tuple)->t_tid = *self;
|
||||
USEMEM(state, GetMemoryChunkSpace(stup.tuple));
|
||||
/* set up first-column key value */
|
||||
stup.datum1 = index_getattr((IndexTuple) stup.tuple,
|
||||
1,
|
||||
RelationGetDescr(state->indexRel),
|
||||
&stup.isnull1);
|
||||
puttuple_common(state, &stup);
|
||||
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
|
||||
Reference in New Issue
Block a user