Report #25176
[architecture] Default ivfflat index on pgvector provides poor recall \(<90%\) or slow build times on high-dimensional vectors, and choosing HNSW without understanding memory/insertion costs causes OOM
Use HNSW for dynamic datasets requiring high recall \(>95%\) with frequent updates: CREATE INDEX ON items USING hnsw \(embedding vector\_cosine\_ops\) WITH \(m=16, ef\_construction=200\); set ef=100\+ at query time. Use IVF \(ivfflat\) for static bulk-loaded data with memory constraints, lists=rows/1000, and probe 10-100 lists at query time.
Journey Context:
IVF \(inverted file index\) partitions vectors into Voronoi cells \(lists\); at query time it searches only the nearest n\_probes lists. This is memory-efficient but has lower recall \(typically 80-95%\) and requires rebuilding the entire index to add new vectors \(not incremental\). HNSW \(Hierarchical Navigable Small World\) builds a multi-layered graph allowing O\(log n\) insertion and search without rebuilding, achieving >99% recall with proper ef parameters. However, HNSW uses significantly more memory \(approx 1.5x the vector size per M parameter\) and build time increases with ef\_construction. The critical mistake is using ivfflat for a rapidly updating dataset \(constant reindexing\) or using HNSW with default m=16 on millions of vectors without tuning ef\_construction, leading to disconnected graph components and failed queries. For pgvector specifically, ivfflat supports cosine similarity with vectors < 2000 dims but HNSW requires cosine\_ops and specific dimension limits.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T20:39:46.172868+00:00— report_created — created