Improved insert logic [skip ci]

This commit is contained in:
Andrew Kane
2023-08-11 12:39:22 -07:00
parent e7a913f361
commit 573a336f53

View File

@@ -128,6 +128,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m, BlockNumber insertPag
OffsetNumber freeOffno = InvalidOffsetNumber; OffsetNumber freeOffno = InvalidOffsetNumber;
OffsetNumber freeNeighborOffno = InvalidOffsetNumber; OffsetNumber freeNeighborOffno = InvalidOffsetNumber;
BlockNumber firstFreePage = InvalidBlockNumber; BlockNumber firstFreePage = InvalidBlockNumber;
bool lastPage;
/* Calculate sizes */ /* Calculate sizes */
etupSize = HNSW_ELEMENT_TUPLE_SIZE(dimensions); etupSize = HNSW_ELEMENT_TUPLE_SIZE(dimensions);
@@ -152,9 +153,14 @@ WriteNewElementPages(Relation index, HnswElement e, int m, BlockNumber insertPag
state = GenericXLogStart(index); state = GenericXLogStart(index);
page = GenericXLogRegisterBuffer(state, buf, 0); page = GenericXLogRegisterBuffer(state, buf, 0);
/* First, try the fastest path */ lastPage = !BlockNumberIsValid(HnswPageGetOpaque(page)->nextblkno);
/* Space for both tuples on the current page */
if (PageGetFreeSpace(page) >= combinedSize) /*
* First, try the fastest path: space for both tuples on the current
* page. Only check on last page to avoid splitting existing tuples in
* rare cases (even though this is technically fine).
*/
if (lastPage && PageGetFreeSpace(page) >= combinedSize)
{ {
nbuf = buf; nbuf = buf;
npage = page; npage = page;
@@ -172,7 +178,7 @@ WriteNewElementPages(Relation index, HnswElement e, int m, BlockNumber insertPag
/* Finally, try space for element only if last page */ /* Finally, try space for element only if last page */
/* Skip if both tuples can fit on the same page */ /* Skip if both tuples can fit on the same page */
if (combinedSize > maxSize && PageGetFreeSpace(page) >= etupSize && !BlockNumberIsValid(HnswPageGetOpaque(page)->nextblkno)) if (lastPage && combinedSize > maxSize && PageGetFreeSpace(page) >= etupSize)
{ {
HnswInsertAppendPage(index, &nbuf, &npage, state, page); HnswInsertAppendPage(index, &nbuf, &npage, state, page);
break; break;