Deep dive into the pgvector PostgreSQL extension for vector operations
pgvector is a PostgreSQL extension that adds vector similarity search capabilities. Store vectors alongside your relational data and perform fast similarity queries with SQL.
-- Create HNSW indexcreate index on items using hnsw (embedding vector_cosine_ops)with (m = 16, ef_construction = 64);-- Parameters:-- m: max connections per layer (higher = better recall, more memory)-- ef_construction: size of dynamic candidate list (higher = better index quality)
-- Cosine distancecreate index on items using ivfflat (embedding vector_cosine_ops);-- L2 distance create index on items using ivfflat (embedding vector_l2_ops);-- Inner productcreate index on items using ivfflat (embedding vector_ip_ops);
-- Check if index is usedexplain (analyze, buffers)select *from itemsorder by embedding <=> query_embeddinglimit 10;-- Look for:-- "Index Scan using items_embedding_idx"
-- Maximum dimensionscreate table items ( embedding vector(16000) -- Max 16,000 dimensions);-- Dimension must matchinsert into items (embedding)values ('[1,2,3]'); -- Error if column is vector(1536)
-- Increase work_mem for index creationset work_mem = '1GB';-- Drop and recreate indexdrop index items_embedding_idx;create index on items using ivfflat (embedding vector_cosine_ops);-- Check statisticsanalyze items;
Slow queries
Use appropriate index type (IVFFlat vs HNSW)
Adjust index parameters (lists, m, ef_construction)
Add filters before similarity search
Consider materialized views for common queries
Out of memory
-- Reduce probes for IVFFlatset ivfflat.probes = 10;-- Reduce ef_search for HNSW set hnsw.ef_search = 40;-- Increase maintenance_work_mem for index buildsset maintenance_work_mem = '2GB';