advanced
pgvector
Храните и индексируйте vectors в PostgreSQL, когда relational metadata и vector search belong together.
pgvector расширяет PostgreSQL типом `vector` и ANN-индексами (IVFFlat, HNSW), чтобы реляционные строки и эмбеддинги жили вместе. Уместен, когда важнее join по метаданным, транзакции, row-level security и умеренный масштаб векторов (до низких десятков миллионов в зависимости от железа), чем латентность отдельного vector SaaS.
CREATE TABLE docs (
id bigserial PRIMARY KEY,
tenant_id uuid NOT NULL,
body text,
embedding vector(1536)
);
CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops);
Паттерн запроса: сначала SQL-фильтры, затем сортировка по оператору расстояния (`<->`, `<#>`, `<=>`) с LIMIT.
На интервью: когда pgvector лучше отдельного store (единая эксплуатация, ACID, join) и когда пора вырастать (миллиарды векторов, экстремальный QPS, спецфильтрация).
Типовые ошибки: индекс только когда таблица огромна; IVFFlat без достаточного lists или ANALYZE; эмбеддинги без колонки версии модели; sequential scan на каждом запросе; bloat и vacuum на таблицах с частыми обновлениями.
Компромисс — простота эксплуатации и единая модель данных против потолка производительности ANN и конкуренции с OLTP за ресурсы Postgres.
Чеклист:
- Покажите колонку vector + индекс HNSW/IVFFlat.
- Совместите SQL-фильтры с ORDER BY по расстоянию.
- Спланируйте версию модели и миграции re-embed.
- Оцените pool соединений и память под ANN.
- Задайте порог перехода на dedicated vector DB.