restructure. add header. copy tweaking

This commit is contained in:
Nathan LeRoy
2026-03-17 13:45:06 -04:00
parent cd736f6ba6
commit 5befbe81c9
7 changed files with 31 additions and 23 deletions
@@ -1,10 +1,19 @@
---
title: pgvector Tradeoffs
weight: 10
draft: false
title: "Start with pgvector: Why You'll Outgrow It Faster Than You Think"
short_description: "We analyzed 110+ community threads to test the 'just use pgvector' heuristic. Here are the six conditions that must all hold — and why most apps fail at least two."
description: "We analyzed 110+ community threads from Hacker News and Reddit to test the 'just use pgvector' heuristic. pgvector is a reasonable default, but only when six specific conditions hold simultaneously. Most applications hit its limits sooner than expected."
date: 2026-03-17T00:00:00Z
author: Nathan LeRoy
featured: false
preview_image: /blog/pgvector-tradeoffs/preview_image.png
social_image: /blog/pgvector-tradeoffs/preview_image.png
tags:
- pgvector
- vector-database
- postgres
---
# "Start with pgvector": Why You Might Outgrow It Faster Than You Think
The most common advice in every vector database thread online is some version of "start with pgvector, graduate later." We analyzed 110+ community threads from Hacker News and Reddit to see if the data supports this heuristic. The short answer is that it's more nuanced than it sounds, and most applications will hit its limits sooner than expected.
---
@@ -23,7 +32,11 @@ The people giving this advice are usually running Postgres for transactional dat
## Six Conditions That Must All Hold
pgvector is a reasonable default, but only when six specific conditions hold *simultaneously*.
After reading through these 110+ threads, a clear pattern emerged. The developers who are happy with pgvector are more than just lucky. They share a specific set of circumstances. We distilled these into six conditions. When all six hold, pgvector is genuinely the right call: you get vector search without operational overhead, and the tradeoffs don't bite you.
However, all six need to hold *simultaneously*. The moment one or two fall away, the pain points that dominate these threads start showing up: slow queries under load, broken filtered search, missing hybrid capabilities. These are scenarios most production applications land in within months of shipping.
Here are the six conditions:
**1. Your vector dataset is under ~1M vectors.** The community's empirical ceiling is around 10M, but the comfortable range is much lower. Above 1M you'll start hitting index-build times, memory pressure, and recall degradation under load.
@@ -78,8 +91,4 @@ There's a reason the "start with pgvector" advice persists despite these limitat
This is a legitimate concern, and we don't want to dismiss it. However, it's also a solved problem with well-known patterns, ranging from simple dual-writes for prototypes to transactional outbox patterns for production, to full CDC pipelines for high-throughput systems.
If you've decided you need a dedicated vector store, don't let sync anxiety push you back to pgvector. This guide walks through three progressively robust sync architectures — each with working code, failure mode analysis, and clear guidance on when to use which:
1. **[Dual-Writes](/documentation/data-synchronization/dual-writes/)** — simple application-level sync for prototypes
2. **[Transactional Outbox](/documentation/data-synchronization/transactional-outbox/)** — production-grade at-least-once delivery
3. **[Change Data Capture](/documentation/data-synchronization/change-data-capture/)** — infrastructure-level sync for high-throughput systems
If you've decided you need a dedicated vector store, don't let sync anxiety push you back to pgvector. Our [Postgres-Qdrant Data Synchronization guide](/documentation/data-synchronization/) walks through three progressively robust sync architectures — each with working code, failure mode analysis, and clear guidance on when to use which.
@@ -1,8 +1,8 @@
---
title: Data Synchronization
weight: 25
title: Keeping Data in Sync
weight: 33
is_empty: false
partition: qdrant
partition: build
---
# Keeping Postgres and Qdrant in Sync
@@ -11,7 +11,7 @@ If you've migrated your vectors to Qdrant but still use Postgres as your source
This section covers three progressively robust sync architectures — from simple application-level dual-writes to production-grade Change Data Capture — with working code, failure mode analysis, and clear guidance on when to use each.
Not sure if you need a dedicated vector store alongside Postgres? Read [pgvector Tradeoffs](/documentation/data-synchronization/pgvector-tradeoffs/) to understand the six conditions under which pgvector is sufficient — and when you'll outgrow it.
Not sure if you need a dedicated vector store alongside Postgres? Read our [pgvector tradeoffs blog post](/blog/pgvector-tradeoffs/) to understand the six conditions under which pgvector is sufficient — and when you'll outgrow it.
## Three Tiers of Sync
@@ -2,10 +2,10 @@
#Delimiter files are used to separate the list of documentation pages into sections.
title: "Migrate to Qdrant"
type: delimiter
weight: 22 # Change this weight to change order of sections
weight: 30 # Change this weight to change order of sections
sitemapExclude: True
_build:
publishResources: false
render: never
partition: qdrant
partition: build
---
@@ -7,5 +7,4 @@
| [From Elasticsearch](/documentation/migrate-to-qdrant/from-elasticsearch/) | Migrate dense vectors from Elasticsearch. | <span class="pill">CLI</span> | 15m | <span class="text-yellow">Intermediate</span> |
| [From pgvector](/documentation/migrate-to-qdrant/from-pgvector/) | Migrate from PostgreSQL pgvector tables. | <span class="pill">CLI</span> | 15m | <span class="text-yellow">Intermediate</span> |
| [Migration Verification](/documentation/migration-verification/) | Verify data integrity and search quality. | <span class="pill">Python</span> | 1h+ | <span class="text-yellow">Intermediate</span> |
| [pgvector Tradeoffs](/documentation/data-synchronization/pgvector-tradeoffs/) | When to outgrow pgvector for Qdrant. | <span class="pill">None</span> | 15m | <span class="text-green">Beginner</span> |
| [Postgres-Qdrant Sync](/documentation/data-synchronization/) | Keep Postgres and Qdrant in sync. | <span class="pill">Python</span> | 30m | <span class="text-yellow">Intermediate</span> |
| [Keeping Data in Sync](/documentation/data-synchronization/) | Keep your source of truth and Qdrant in sync. | <span class="pill">Python</span> | 30m | <span class="text-yellow">Intermediate</span> |
@@ -1,8 +1,8 @@
---
title: Migration Tool
weight: 23
weight: 31
is_empty: false
partition: qdrant
partition: build
---
# Migrate to Qdrant
@@ -53,4 +53,4 @@ These flags apply to all source types:
Once your data is in Qdrant, verify that everything arrived correctly:
- **[Migration Verification Guide](/documentation/migration-verification/)** — a structured framework covering data integrity checks and search quality validation.
- **[Data Synchronization](/documentation/data-synchronization/)** — if you're running Postgres alongside Qdrant, learn how to keep them in sync.
- **[Keeping Data in Sync](/documentation/data-synchronization/)** — if you're running a relational database alongside Qdrant, learn how to keep them in sync.
@@ -1,8 +1,8 @@
---
title: Migration Verification
weight: 24
weight: 32
is_empty: false
partition: qdrant
partition: build
---
# Migration Verification Guide
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB