From 309fa94c055c361de3c7142560b039f8d90551a3 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Thu, 10 Aug 2023 08:52:45 -0700 Subject: [PATCH] Improved performance for duplicates --- src/hnswbuild.c | 15 +++++++++------ src/hnswutils.c | 1 - 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/hnswbuild.c b/src/hnswbuild.c index 1073cc8..1a8ff7b 100644 --- a/src/hnswbuild.c +++ b/src/hnswbuild.c @@ -290,14 +290,17 @@ InsertTuple(Relation index, Datum *values, HnswElement element, HnswBuildState * /* Insert element in graph */ *dup = HnswInsertElement(element, entryPoint, NULL, procinfo, collation, m, efConstruction, false); - /* Update neighbors */ - for (int lc = element->level; lc >= 0; lc--) + if (*dup == NULL) { - int lm = HnswGetLayerM(m, lc); - HnswNeighborArray *neighbors = &element->neighbors[lc]; + /* Update neighbors */ + for (int lc = element->level; lc >= 0; lc--) + { + int lm = HnswGetLayerM(m, lc); + HnswNeighborArray *neighbors = &element->neighbors[lc]; - for (int i = 0; i < neighbors->length; i++) - HnswUpdateConnection(element, &neighbors->items[i], lm, lc, NULL, NULL, procinfo, collation); + for (int i = 0; i < neighbors->length; i++) + HnswUpdateConnection(element, &neighbors->items[i], lm, lc, NULL, NULL, procinfo, collation); + } } /* Update entry point if needed */ diff --git a/src/hnswutils.c b/src/hnswutils.c index f1f3a55..2f69252 100644 --- a/src/hnswutils.c +++ b/src/hnswutils.c @@ -942,7 +942,6 @@ HnswInsertElement(HnswElement element, HnswElement entryPoint, Relation index, F } /* Look for duplicates */ - /* This must come last, since duplicate updates can fail */ if (level >= 0 && !vacuuming) { dup = HnswFindDuplicate(element);