Setiap aplikasi RAG membutuhkan database vektor. Pilihan antara pgvector, Pinecone, Qdrant, dan Weaviate bukan hanya keputusan performa — ini adalah keputusan kompleksitas operasional, biaya, dan integrasi. Saya telah menggunakan pgvector di AI Gymbro dan bereksperimen dengan Pinecone dan Qdrant untuk pencarian dokumen ERP.
Pasar database vektor mengkonsolidasikan secara signifikan di 2024-2025. Pinecone tetap menjadi pemimpin pasar. Qdrant (open-source) telah melihat adopsi cepat untuk deployment self-hosted. pgvector dengan pengindeksan HNSW mencapai ~95% performa Pinecone pada 1 juta vektor dengan nol biaya infrastruktur tambahan.
pgvector menambahkan tipe data vektor dan operator pencarian kesamaan ke PostgreSQL. Indeks HNSW dramatis meningkatkan performa kueri. Keunggulan utama: embedding vektor Anda berada dalam database yang sama dengan data aplikasi Anda. Anda dapat JOIN embedding dengan data pengguna dan menjalankan semuanya dalam satu transaksi.
Pinecone adalah database vektor sebagai layanan yang dibangun khusus. Tidak ada infrastruktur yang dikelola, penskalaan otomatis, latensi kueri sub-10ms pada skala miliar, dan API SDK/REST sederhana. Tradeoff: biaya. Tier Starter Pinecone menangani ~100K vektor. Tier Standard mulai dari ~$70/bulan untuk serverless.
Vector Database Performance Comparison — 1M vectors, 1536 dim
Database P95 Latency QPS Cost/mo Self-host?
──────────────────────────────────────────────────────────────
pgvector HNSW 45ms 500 $50 (pg) Yes
Qdrant 8ms 2,000 $40 (VPS) Yes
Pinecone 12ms unlimited $70+ No
Weaviate Cloud 15ms ~1,000 $80+ No
pgvector HNSW Setup:
CREATE EXTENSION vector;
CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops)
WITH (m = 32, ef_construction = 128);
→ At query time: SET hnsw.ef_search = 64;
Recommended by use case:
≤ 5M vectors + PostgreSQL already → pgvector
Need best filtering + self-host → Qdrant
Billion-scale + fully managed → PineconeUntuk pengguna PostgreSQL yang mempertimbangkan pgvector: parameter indeks HNSW ef_construction dan m dramatis mempengaruhi tradeoff kualitas/performa. Saya menjalankan ef_construction=128 dan m=32 untuk embedding konten fitness saya — indeks kualitas lebih tinggi yang membutuhkan lebih lama untuk dibangun tetapi memberikan recall yang lebih baik.
Qdrant adalah database vektor open-source yang ditulis dalam Rust dengan performa dan kemampuan filtering yang luar biasa. Ini mendukung vektor padat dan jarang dalam koleksi yang sama, memungkinkan pencarian hybrid native tanpa tooling eksternal. Self-hosted pada droplet DigitalOcean $20/bulan, Qdrant menangani 1 juta vektor dengan nyaman.
Pada 1 juta vektor dengan embedding OpenAI 1536-dimensi dan target latensi P99 50ms: pgvector (HNSW, m=32): P95 45ms, menangani ~500 QPS pada instance PostgreSQL terkelola $50/bulan. Qdrant (self-hosted): P95 8ms, menangani ~2.000 QPS pada VPS $40/bulan. Pinecone (serverless): P95 12ms, menangani QPS tak terbatas.
-- pgvector: vector search with metadata filter
-- JOIN with application data in same query
SELECT
d.id,
d.content,
d.metadata,
u.username AS author, -- JOIN with users table!
1 - (d.embedding <=> $1::vector) AS similarity
FROM documents d
JOIN users u ON d.user_id = u.id
WHERE
d.metadata->>'category' = 'exercise' -- metadata filter
AND d.created_at > NOW() - INTERVAL '30 days'
ORDER BY d.embedding <=> $1::vector -- vector similarity
LIMIT 5;
-- Pinecone equivalent (Python)
# No JOIN possible — must fetch user from separate DB call
index = pinecone.Index("my-index")
results = index.query(
vector=query_embedding,
filter={"category": "exercise"}, # metadata filter
top_k=5,
include_metadata=True,
)
# Then separately: fetch user data from your database
user_ids = [r["metadata"]["user_id"] for r in results["matches"]]
users = await db.fetch_users(user_ids) # second DB call!Pencarian vektor murni melewatkan kecocokan keyword yang tepat. Pencarian hybrid menggabungkan kesamaan vektor dengan skor keyword BM25. Qdrant mendukung ini secara native. Untuk pgvector, Anda menggabungkan pencarian vektor dengan pencarian teks lengkap bawaan PostgreSQL.
Pemindaian berurutan pgvector (tanpa indeks) menjadi sangat lambat di atas 100K vektor — kueri yang membutuhkan 5ms dengan 10K vektor membutuhkan 500ms+ dengan 1 juta vektor. Selalu buat indeks HNSW sebelum menyimpan lebih dari 50K vektor.
Jika Anda mulai dengan pgvector dan perlu menskalakan melewati batasnya, migrasi ke Pinecone atau Qdrant adalah langsung: embedding Anda hanyalah array floating-point. Ekspor dari PostgreSQL, impor ke Pinecone/Qdrant melalui API bulk upload mereka, perbarui kode pencarian Anda.
Gunakan pgvector jika: Anda menggunakan PostgreSQL, Anda memiliki kurang dari 5 juta vektor, atau Anda membutuhkan konsistensi transaksional. Gunakan Qdrant jika: Anda tidak menggunakan PostgreSQL, Anda membutuhkan performa filtering terbaik, atau Anda ingin self-host. Gunakan Pinecone jika: Anda membutuhkan skala miliaran dengan nol overhead operasional, atau tim Anda tidak bisa mengelola infrastruktur.