mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
Avoid O(N^2) behavior when enlarging SPI tuple table in spi_printtup().
For no obvious reason, spi_printtup() was coded to enlarge the tuple pointer table by just 256 slots at a time, rather than doubling the size at each reallocation, as is our usual habit. For very large SPI results, this makes for O(N^2) time spent in repalloc(), which of course soon comes to dominate the runtime. Use the standard doubling approach instead. This is a longstanding performance bug, so back-patch to all active branches. Neil Conway
This commit is contained in:
parent
fcdfce6820
commit
6e5d9f278c
@ -1797,7 +1797,8 @@ spi_printtup(TupleTableSlot *slot, DestReceiver *self)
|
|||||||
|
|
||||||
if (tuptable->free == 0)
|
if (tuptable->free == 0)
|
||||||
{
|
{
|
||||||
tuptable->free = 256;
|
/* Double the size of the pointer array */
|
||||||
|
tuptable->free = tuptable->alloced;
|
||||||
tuptable->alloced += tuptable->free;
|
tuptable->alloced += tuptable->free;
|
||||||
tuptable->vals = (HeapTuple *) repalloc(tuptable->vals,
|
tuptable->vals = (HeapTuple *) repalloc(tuptable->vals,
|
||||||
tuptable->alloced * sizeof(HeapTuple));
|
tuptable->alloced * sizeof(HeapTuple));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user