mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-12 07:36:55 +08:00
Improved insert logic [skip ci]
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user