⚡The verdict up front
The first real decision is not "which vector database" but "do I need a dedicated one at all". Every production RAG system we have seen fail on retrieval failed on chunking, embeddings or filtering logic — none failed because the vector index was 15% slower than an alternative. All three options here are genuinely good. What differs is who operates the thing, how you pay, and how filtering behaves.
So: pgvector when Postgres is already your system of record, Pinecone when your team should never think about database infrastructure, Qdrant when you want a dedicated engine you control. The rest of this article is the evidence for those three sentences.
| Dimension | Pinecone | pgvector | Qdrant |
|---|---|---|---|
| What it is | Fully managed vector database (SaaS) | PostgreSQL extension | Dedicated vector DB, written in Rust |
| Operational model | Zero ops — serverless indexes | Your existing Postgres, or managed Postgres | Self-host (open source) or Qdrant Cloud |
| Index types | Proprietary ANN (HNSW-family), sparse + dense | HNSW and IVFFlat, plus exact search | HNSW with per-collection tuning, quantization |
| Filtering | Metadata filters on search | Full SQL — WHERE, joins, partial indexes | Indexed payload fields, filtered during traversal |
| Hybrid search | Dense + sparse vectors natively | Combine with Postgres full-text search | Dense + sparse vectors natively |
| Data model | Vectors + metadata only | Vectors live next to your relational data | Vectors + JSON payloads |
| Cost driver | Storage + read/write units (usage-based) | Your Postgres bill — often zero incremental | Your infrastructure, or cloud pricing |
| Licence | Proprietary SaaS | Open source (PostgreSQL licence) | Open source (Apache 2.0) |
| Best for | Teams avoiding all DB operations | Postgres shops, moderate vector scale | Performance + control, heavy filtering |
🏗️Three operational models — decide this first
Pinecone is a service. You create an index through an API, push vectors, query over HTTPS, and never see a server, a vacuum process or a replication setting. Serverless indexes scale with usage and you pay for what you consume. The trade is the standard managed-SaaS one: no operational burden, in exchange for a proprietary system holding your vectors behind an API, billed per operation.
pgvector is not a database — it is an extension that adds a vector column type and similarity indexes to PostgreSQL. Enabling it is one command, and it is available on essentially every managed Postgres platform: AWS RDS, Google Cloud SQL, Supabase, Neon, Railway. The consequence that matters: your vectors sit in the same database, the same transactions and the same backups as the rest of your application data. There is no second system to secure, monitor, or keep in sync when a document is updated or deleted.
Qdrant is a dedicated, open-source vector database written in Rust. You can run it yourself — a single Docker container to start, a distributed cluster with sharding and consensus-based replication when you grow — or use Qdrant Cloud to have it run for you. It occupies the middle: dedicated-engine performance and features, with a self-host option Pinecone does not offer and a managed option pgvector does not need.
The sync problem is the silent killer. If your vectors live in a separate system from your documents, every update, delete and permission change has to propagate across two stores. That pipeline is where stale answers and permission leaks are born. pgvector makes the problem disappear; the other two make it your job.
🔍Indexing: everyone runs HNSW — the details differ
HNSW (Hierarchical Navigable Small World) is the approximate nearest-neighbour index all three converge on, because it offers the best recall-versus-latency trade-off of the mainstream algorithms. It builds a multi-layer graph over your vectors; queries walk the graph to find nearest neighbours without scanning everything. The tuning knobs — m (connections per node) and ef_construction (build-time search width) — trade memory and build time against recall, and they exist in pgvector and Qdrant in recognisably the same form.
pgvector also offers IVFFlat, an older partition-based index that is faster to build and lighter on memory but generally weaker on recall. In practice, since pgvector 0.7 added HNSW and later releases improved build speed and added iterative index scans, HNSW is the default answer in Postgres too. The one honest constraint: HNSW indexes are memory-hungry everywhere. The graph lives in RAM for fast traversal, whichever of the three you choose — so "how much memory does the index need" is a sizing question you cannot delegate away.
Qdrant layers on quantization options (scalar, product, binary) that compress vectors to shrink the memory footprint and speed up scoring, re-scoring only the shortlist at full precision. Pinecone handles index internals for you entirely — you get no knobs, which is either a relief or a frustration depending on who is on your team. For hybrid search, Pinecone and Qdrant both accept dense and sparse vectors natively; pgvector pairs with Postgres's built-in full-text search, which is less integrated but built on tooling your team already knows.
One parameter worth understanding regardless of platform is the query-time recall knob — ef_search in pgvector and Qdrant, effectively abstracted away in Pinecone. Raising it searches more of the graph: better recall, higher latency. The right setting is a measurement on your data, not a default, and it is one of the first things to tune when retrieval quality is questioned before blaming the embeddings.
🧲Filtering: where the decision usually gets made
Real RAG queries are never "find the five most similar chunks". They are "find the five most similar chunks in documents this user is allowed to see, from the current policy version, in English". Filtering is not an edge case — it is the query. How each system handles it is more consequential than raw index speed.
pgvector filters with ordinary SQL. Permissions, tenants, dates and categories are WHERE clauses and joins against the tables you already have — enforced by the same logic as the rest of your application, testable with the same tools. Historically the weakness was combining a selective WHERE clause with a vector index scan: filter first and you might scan too little of the graph to find good matches. pgvector 0.8's iterative index scans address exactly this by continuing the index scan until enough filtered candidates are found, and partial HNSW indexes (build the index over a WHERE subset) handle hot slices like a single tenant.
Qdrant treats filtering as a first-class index problem: payload fields get their own indexes, and filtering is applied during graph traversal rather than as a post-filter, so selective filters do not wreck recall the way naive pre-filtering does. For filter-heavy workloads — multi-tenant systems, permission-aware retrieval — this is Qdrant's strongest argument. Pinecone filters on metadata attached to each vector and isolates tenants with namespaces; it works well, with the caveat that your permission model now lives in metadata you must keep synchronised from your system of record.
💰Scale and cost: honest version
We are not going to quote benchmark numbers, because vector benchmarks are notoriously workload-dependent and mostly measure configurations you will not run. The honest scaling picture: pgvector scales the way Postgres scales — vertically with generous headroom, plus read replicas for query throughput — and for most RAG workloads (millions of vectors, not billions) that ceiling is not the binding constraint; chunking quality is. Qdrant scales horizontally through sharding across a cluster, which is the architecture you want if you genuinely outgrow one large node. Pinecone scales without you doing anything, which is the entire product.
Cost models differ in kind, not degree. pgvector usually costs nothing incremental — it rides on a Postgres instance you already pay for, and the real cost is the memory headroom HNSW wants. Qdrant self-hosted costs infrastructure plus the engineering time to run it; Qdrant Cloud converts that to a bill. Pinecone is usage-based: you pay for storage and for read and write units, so cost tracks traffic — cheap and effortless at low volume, a line item that needs watching at high volume, especially on write-heavy ingestion pipelines.
The cost question inverts the usual instinct. At small scale, managed pricing is trivially cheap and engineering time is the expensive thing — Pinecone wins on total cost. At large scale with steady high traffic, per-operation pricing compounds and self-hosting gets attractive — but only if you actually have the capacity to operate it. Price your traffic shape, not the marketing page.
🎯Who should pick what
RAG vs fine-tuning: which problem do you have?RAG system cost: build vs buyTop RAG development companies in the USA
Postgres shop, vectors in the millions → pgvector
One system to back up, secure and reason about. SQL filtering doubles as your permission model. Leave only when you measure a limit, not when a benchmark suggests one.
Small team, no database appetite → Pinecone
Zero operations, predictable developer experience, hybrid search built in. Accept usage pricing and vendor-held vectors as the fee.
Heavy filtering or self-hosting requirement → Qdrant
Indexed payload filtering during traversal is the best implementation of the thing real RAG queries actually do, and Apache 2.0 plus Docker keeps it inside your boundary.
Already on Supabase or Neon → pgvector by default
Your managed Postgres already includes it. Adding a second vector system before exhausting the first is paying a complexity tax for nothing.
Massive scale with horizontal growth → Qdrant
Sharded clusters with replication are the designed-in growth path. Postgres read replicas carry query load far, but sharding is not its native shape.
Unsure → pgvector, then measure
It is the only option where changing your mind later does not involve migrating out of a proprietary system. Boring is a feature.