Here is a cost that never appears on a vector-database benchmark: the rebuild.

Benchmarks load a fixed dataset, build the index once, and measure queries against it. Nothing changes while the numbers are being taken. Production is the opposite — vectors arrive and expire all day — and that difference is where a whole category of pain lives that the leaderboard can't see.

Why graph indexes are a treadmill#

HNSW and DiskANN are graph indexes. You build a carefully-wired graph of neighbors once, and queries walk it. The wiring is the performance. The problem is that heavy update traffic — inserts, and especially deletes — frays that wiring. Deleted nodes leave tombstones; new nodes get stitched in with less global context than a from-scratch build would give them. Recall drifts down. So the operational answer, across most graph-index deployments, is to periodically rebuild the index from scratch.

That rebuild is a tax. It's compute you spend not to add capability but to undo the entropy your own writes created. On a static or append-only corpus you rarely pay it. On a corpus that turns over constantly — a memory store for agents, a product catalog, anything with a TTL — you pay it again and again, and it scales with the very thing you were trying to grow. This is the same rebuild pressure that makes billion-scale graph indexes so expensive to keep fresh.

The other design: an index that heals itself#

The alternative is old in databases and newer in vector search: don't rebuild, rebalance.

SPFresh, from a SOSP '23 paper pointedly titled Incremental In-Place Update for Billion-Scale Vector Search, is the reference design. Instead of a graph, vectors live in posting lists — clusters, each with a centroid. Search means finding the nearest centroids and scanning only their lists. Updates don't rewire a global graph; they touch clusters. And the maintenance is local: when a posting list grows too large it splits, when one shrinks too small it merges, and — the crucial part — only the vectors sitting near a boundary that just moved get reassigned. The rest of the index doesn't move.

That locality is the whole trick. A global rebuild touches everything; SPFresh touches the seams. So the index can absorb a continuous write stream and stay balanced without ever going offline to reconstruct itself.

A graph index treats writes as damage to be periodically repaired. An in-place index treats writes as the normal state and rebalances at the seams.

HFresh: the shipping version#

You don't have to read this as theory. Weaviate ships an SPFresh-class index called HFresh, and its release history through June and July of 2026 — a run of fixes across v1.37.10, v1.37.12, and v1.38.2 touching searchProbe defaults and quantizer initialization — is what a maturing production index looks like.

The design in Weaviate's own docs matches SPFresh closely: it partitions vectors into clusters, uses an HNSW index over the centroids to find the right partitions fast, then searches only the most relevant posting lists. Its maintenance is described in one line worth quoting — "self-balancing in the background, no full rebuilds."

What makes the on-disk story affordable is quantization. HFresh leans on Rotational Quantization (RQ), which is training-free: it applies a fast pseudorandom rotation to each vector, then crushes each dimension from 32 bits down to 8 or 1. The centroid index stays in memory under RQ-8 (about 4× smaller — enough precision to pick the right partition), while the posting lists sit on disk under RQ-1 (about 32× smaller — so each disk read pulls in far more candidates), with a final rescore against the uncompressed vectors to keep accuracy. That's why Weaviate positions HFresh for memory-constrained deployments: most of the index never has to be in RAM.

Read the write pattern, not the recall column#

The reflex when choosing a vector index is to compare recall-at-latency numbers. Those matter, but they're measured on frozen data, so they systematically hide the axis that actually separates these two designs: how your corpus changes.

If your data is static or append-only and you want maximum throughput, a graph index with everything in RAM is still the right call, and HFresh's limits are real — today it supports only cosine and l2-squared distance, so dot-product workloads are out. But if your corpus churns — if you're constantly writing and expiring vectors, which describes most agent-memory and real-time-retrieval systems — then the honest comparison isn't a recall number. It's the rebuild you keep scheduling on one design and never run on the other.