diff --git a/src/hnswutils.c b/src/hnswutils.c index 6721ae1..56db0ee 100644 --- a/src/hnswutils.c +++ b/src/hnswutils.c @@ -566,7 +566,13 @@ HnswSearchLayer(Datum q, List *ep, int ef, int lc, Relation index, FmgrInfo *pro pairingheap_add(C, &(CreatePairingHeapNode(hc)->ph_node)); pairingheap_add(W, &(CreatePairingHeapNode(hc)->ph_node)); - wlen++; + /* + * Do not count elements being deleted towards ef when vacuuming. It + * would be ideal to do this for inserts as well, but this could + * affect insert performance. + */ + if (skipElement == NULL || list_length(hc->element->heaptids) != 0) + wlen++; } while (!pairingheap_is_empty(C)) @@ -625,12 +631,19 @@ HnswSearchLayer(Datum q, List *ep, int ef, int lc, Relation index, FmgrInfo *pro pairingheap_add(C, &(CreatePairingHeapNode(ec)->ph_node)); pairingheap_add(W, &(CreatePairingHeapNode(ec)->ph_node)); - /* TODO Possibly don't count elements being deleted in wlen */ - wlen++; + /* + * Do not count elements being deleted towards ef when + * vacuuming. It would be ideal to do this for inserts as + * well, but this could affect insert performance. + */ + if (skipElement == NULL || list_length(e->element->heaptids) != 0) + { + wlen++; - /* No need to decrement wlen */ - if (wlen > ef) - pairingheap_remove_first(W); + /* No need to decrement wlen */ + if (wlen > ef) + pairingheap_remove_first(W); + } } } } diff --git a/test/t/016_hnsw_vacuum_recall.pl b/test/t/016_hnsw_vacuum_recall.pl index 35548aa..815fce9 100644 --- a/test/t/016_hnsw_vacuum_recall.pl +++ b/test/t/016_hnsw_vacuum_recall.pl @@ -61,7 +61,7 @@ $node->safe_psql("postgres", ); # Add index -$node->safe_psql("postgres", "CREATE INDEX ON tst USING hnsw (v vector_l2_ops) WITH (m = 4);"); +$node->safe_psql("postgres", "CREATE INDEX ON tst USING hnsw (v vector_l2_ops) WITH (m = 4, ef_construction = 8);"); # Delete data $node->safe_psql("postgres", "DELETE FROM tst WHERE i > 2500;");