Currently viewing the human version
Switch to AI version

What the Hell is pgvector and Why You Actually Need It

PostgreSQL Architecture Overview: PostgreSQL uses a process-per-connection model with shared memory pools, background writer processes, and the WAL (Write-Ahead Log) system. Extensions like pgvector integrate directly into this architecture, storing vector data in regular PostgreSQL tables with specialized indexing.

pgvector is a PostgreSQL extension that lets you store and search vector embeddings without migrating to some expensive vector database service. Andrew Kane started it around 2021, I think, and it's become the go-to solution for engineers who don't want to explain to their boss why the AI features cost $5000/month in Pinecone fees.

Look, we all know the AI hype is real. Every product manager wants "semantic search" and "RAG applications" yesterday. Instead of spinning up another service that'll cost you an arm and a leg, pgvector lets you add vector search to your existing PostgreSQL database. You know, the one that's been rock-solid for the past decade.

Why Everyone's Moving to pgvector

The main reasons engineers pick pgvector over managed vector databases:

  • It stores vectors up to 16,000 dimensions (which covers 99% of embedding models you'll actually use)
  • HNSW and IVFFlat indexes for fast similarity search (HNSW is usually better unless you're broke and can't afford the RAM)
  • Works with regular SQL queries so you can combine vector search with WHERE clauses without writing some proprietary query language
  • ACID transactions because your data integrity actually matters in production
  • Uses PostgreSQL tooling you already know instead of learning another database admin interface

Version 0.8.x Finally Fixed the Shit That Mattered

pgvector 0.8.x finally fixed the shit from earlier versions (I think 0.8.0 dropped in like November 2024, maybe?):

  • Way faster queries than 0.7.x (which was painfully slow with any WHERE clauses - like watching paint dry)
  • Actually returns complete results for filtered searches (0.7.x would return like 3 results out of 50 and call it a day)
  • Iterative index scans so combining vector search with filters doesn't return garbage anymore
  • Less terrible query planning because PostgreSQL's cost estimation was completely fucked with vectors before

Translation: it actually works in production now instead of just demos.

Where You Can Actually Use It

pgvector is available pretty much everywhere PostgreSQL runs:

Cloud Providers (the easy button):

Managed PostgreSQL Services (often better than cloud giants):

  • Supabase - enable with one click, great for prototyping
  • Neon - serverless PostgreSQL that doesn't suck
  • Timescale Cloud - if you need time-series data with vectors
  • Crunchy Bridge - reliable managed PostgreSQL

Installation Methods:

  • Docker (recommended for dev work)
  • Package managers (Homebrew, APT, Yum, conda-forge)
  • Compile from source if you hate yourself

Programming Languages:
Client libraries for like 20+ languages including Python, JavaScript, Go, Rust, and Java. Python library is solid with proper NumPy integration. JavaScript works fine but watch out for type issues. Go library is decent if you enjoy writing verbose SQL everywhere. Rust has all the features but enjoy your 10+ minute compile times. Java library works fine if you're stuck in Spring Boot hell - integrates with JDBC and Hibernate without much drama.

Bottom line: if you're already running PostgreSQL and need vector search, pgvector is probably your best bet. Unless you're Google or have unlimited budget, in which case knock yourself out with the fancy stuff.

But before you jump in, you need to understand what you're actually getting into - the capabilities, the limitations, and the production gotchas that'll bite you if you're not careful.

What pgvector Actually Does (And Where It'll Screw You Over)

pgvector adds vector search to PostgreSQL, but there are production gotchas that'll bite you if you're not careful.

Vector Storage Types (And Their Memory Traps)

pgvector gives you four data types, each with different ways to eat your RAM:

  • vector: Regular floats, 16k dimensions max. Takes 4 * dimensions + 8 bytes per vector. A million 1536-dimensional vectors? That's 6GB just for the vectors.
  • halfvec: Half-precision floats, 2 * dimensions + 8 bytes. Saves memory but your similarity scores might look weird due to precision loss.
  • bit: Binary vectors up to 64k dimensions. Great if you're into quantization, useless otherwise.
  • sparsevec: Sparse vectors, 8 * non-zero elements + 16 bytes. Works well for NLP embeddings with lots of zeros.

Distance Functions That Actually Matter

Vector Distance Functions: The choice between L2 (Euclidean), cosine, and inner product distance significantly impacts search accuracy. L2 works well for most embeddings, cosine is ideal for normalized vectors (most modern AI models), and inner product handles non-normalized data but returns negative values due to PostgreSQL's ascending sort requirement.

Six distance operators, but you'll probably only use three:

  • <-> (L2/Euclidean): The default everyone uses
  • <=> (Cosine): For normalized embeddings, which most modern models output
  • <#> (Inner product): Returns negative values because PostgreSQL only sorts ascending (yes, really)
  • <+>, <~>, <%>: Manhattan, Hamming, and Jaccard for specialized cases

Pro tip: If your similarity search returns garbage results, check if your vectors are normalized. Cosine distance assumes normalized vectors, and you'll hate your life if they're not.

The Two Index Types (And Why You'll Probably Pick Wrong)

HNSW Algorithm Visualization

HNSW - Fast Queries, Slow Builds, RAM Hog

HNSW indexes create multilayer graphs that query fast but:

-- This will probably timeout on your first try
SET maintenance_work_mem = '4GB';  -- Hope you have the RAM
CREATE INDEX CONCURRENTLY items_embedding_idx ON items
    USING hnsw (embedding vector_cosine_ops)
    WITH (m = 16, ef_construction = 64);

IVFFlat - Faster Builds, Worse Performance

IVFFlat partitions your vector space:

  • Builds faster than HNSW but queries slower
  • Uses less memory during index building
  • Needs tuning: Set lists to rows/1000 for small datasets, sqrt(rows) for large ones
  • Query parameter: ivfflat.probes controls how many partitions to search (higher = more accurate, slower)

Version 0.8.x Fixed the Filtering Disaster

Before 0.8.0, combining vector search with WHERE clauses was a nightmare. Queries would return 3 results when you asked for 20 because filtering happened after the vector index scan.

0.8.0+ added iterative scanning that actually works:

-- This would return incomplete results in 0.7.x
-- Now it actually works properly
SET hnsw.iterative_scan = 'relaxed_order';

SELECT title, embedding <=> '[your_query_vector]' as distance
FROM documents
WHERE category = 'technical' AND published_at > '2024-01-01'
ORDER BY distance
LIMIT 10;

The relaxed_order setting lets PostgreSQL scan more vectors to find enough filtered results. Without it, you're back to the bad old days of incomplete result sets.

Production Memory Gotchas

HNSW Index Building Memory Explosion: HNSW indexes are memory hogs during builds - I've seen them eat like 10x-12x more RAM than the final index, maybe more. I learned this the hard way when building an index on ~2M vectors crashed our 16GB server at like 2 AM - maybe 2:30? Was definitely middle of the night. The ~800MB final index somehow ate like 12GB while building - maybe more, the server basically died. Budget way more RAM than you think you need or your server will crash.

Query Memory Usage: Set work_mem appropriately for vector queries. Too low and you get disk spills, too high and you run out of memory with concurrent queries. Sweet spot is usually 256MB-512MB per connection for typical embedding sizes.

Memory Usage Reality Check:

  • A million 1536-dimensional vectors eats roughly 6GB just for the raw data
  • HNSW indexes add another chunk on top - maybe like 20-30%, could be way more
  • During index building, expect it to balloon to 8-12x the final size or your server dies
  • Example: ~800MB final index somehow consumed like 12GB during build, then settled back to maybe ~1GB total (data + index)
  • Concurrent queries each need their own work_mem chunk - I usually set like 256-512MB per connection but YMMV

Other Features You Might Actually Use

Real Production Use Cases

Common Vector Search Applications: RAG systems store document chunks alongside metadata for context-aware retrieval. Semantic search replaces keyword matching with meaning-based queries. Recommendation engines combine user behavior vectors with content embeddings. Deduplication systems identify similar content across large datasets using vector similarity thresholds.

pgvector works well for:

Just remember: pgvector is PostgreSQL first, vector database second. If you need Pinecone-level performance, you'll need to tune the shit out of it or consider dedicated vector databases.

The big question is whether pgvector can actually compete with dedicated vector databases or if you're just setting yourself up for disappointment.

pgvector vs Other Vector Databases

Feature

pgvector

Pinecone

Qdrant

Weaviate

Chroma

Deployment Model

Self-hosted or managed PostgreSQL

Fully managed cloud

Self-hosted or cloud

Self-hosted or cloud

Self-hosted or cloud

Pricing

Free (PostgreSQL hosting costs)

$0.096/1M queries + storage

Free tier + usage-based

Free tier + usage-based

Open source

Max Dimensions

16,000 (vector), 64,000 (binary)

20,000

65,536

65,536

No limit

Index Types

HNSW, IVFFlat

Proprietary

HNSW, IVF

HNSW

HNSW

Distance Metrics

L2, Cosine, Inner Product, L1, Hamming, Jaccard

L2, Cosine, Dot Product

L2, Cosine, Dot Product, Manhattan

L2, Cosine, Dot Product, Manhattan, Hamming

L2, Cosine, Inner Product

Metadata Filtering

Full SQL support

JSON-based filters

JSON-based filters

GraphQL filters

Metadata filters

Data Types

Vector, sparse, binary, half-precision

Dense vectors only

Dense, sparse, binary

Dense vectors, multi-modal

Dense vectors

ACID Compliance

✅ Full PostgreSQL ACID

❌ Eventual consistency

❌ Limited transactions

❌ Limited transactions

❌ Limited transactions

Multi-tenancy

PostgreSQL schemas/RLS

Native namespaces

Collections

Tenants

Databases

Backup & Recovery

PostgreSQL WAL, PITR

Managed backups

Snapshots

Manual backups

Manual backups

Query Language

SQL

REST API

REST API + gRPC

GraphQL + REST

Python/JS APIs

Hybrid Search

Built-in full-text search

Sparse-dense hybrid

Payload-based

Keyword + vector

Limited

Scalability

PostgreSQL scaling

Auto-scaling

Horizontal scaling

Horizontal scaling

Horizontal scaling

Learning Curve

Easy if you love reading 500-page PostgreSQL manuals

Medium

Medium

High (GraphQL + vectors = debugging hell)

Low-Medium

Reality Check

Demos look great, production means 8GB+ RAM for index builds or your server crashes

Costs $5k/month but actually works

Decent once you figure out collections

GraphQL + vectors = debugging hell

Memory usage explodes from 500MB to 8GB+ when you scale past toy datasets

Performance (QPS)

1,000-10,000+ (if you're lucky and tune everything perfectly)

100,000+ (and they'll charge you for every single one)

10,000+ (actually achievable)

5,000+ (on a good day)

1,000+ (optimistically)

Surprise Costs

Server crashes when building large indexes

Per-query pricing will bankrupt you

Hosting costs scale with data

Enterprise features cost extra

Memory usage explodes with scale

Memory Efficiency

Excellent with half-precision (good luck debugging weird similarity scores)

Good (and expensive)

Excellent

Good

RAM hungry

Complex Queries

Full SQL joins, aggregations

Limited filtering (JSON hell)

JSON filtering (better than Pinecone)

GraphQL queries (if you're into that)

Simple filtering only

Operational Overhead

PostgreSQL maintenance (enjoy your 3am VACUUM alerts)

Fully managed (but vendor lock-in)

Medium (Docker makes it tolerable)

Medium (lots of knobs to turn)

Low (because there are no advanced features)

When Shit Breaks

Fix it yourself with PostgreSQL knowledge

File a support ticket and wait

GitHub issues + community help

Documentation maze

Good luck, it's open source

Questions Engineers Actually Ask (At 3AM)

Q

Why does my pgvector index take 8 hours to build and use 32GB of RAM?

A

HNSW indexes are memory hogs during construction. Building an HNSW index on millions of vectors can consume 8-16x more memory than the final index size.If you see this error: ERROR: could not resize shared memory segment "/PostgreSQL.1804289383" to 2147483648 bytes: No space left on device, your maintenance_work_mem is too low. Set it to something massive (4-8GB minimum) or your build will fail.Also, disable auto-vacuum on the table during build with ALTER TABLE your_table SET (autovacuum_enabled = false); or it'll compete for resources and make everything slower. I learned this when a vacuum process kicked in during index building and turned a 2-hour operation into an 8-hour nightmare.

Q

How do I debug when similarity search returns garbage results?

A

99% of the time it's because your vectors aren't normalized and you're using cosine distance. Cosine distance assumes your vectors have magnitude = 1.0, but if your embeddings from Open

AI or whatever aren't normalized, your similarity scores will be total garbage. Run SELECT AVG(vector_norm(embedding)) FROM your_table

  • if it's not close to 1.0, normalize those fuckers first or you'll hate your life.
Q

Why does adding a WHERE clause make my vector query 100x slower?

A

You probably hit the filtering problem that plagued pgvector before 0.8.0. The vector index would scan a small subset, apply your WHERE filter, and return like 3 results out of the 50 you requested. Set hnsw.iterative_scan = 'relaxed_order' to let PostgreSQL scan more vectors until it finds enough filtered results. Also make sure you have regular B-tree indexes on your filter columns.

Q

How do I migrate from Pinecone without everything falling apart?

A

Export your vectors from Pinecone (good luck with their API rate limits

  • I think it's like 100 requests/minute?

Maybe less?), then use PostgreSQL's COPY command for bulk loading. Here's how my last migration of like 2.5M vectors went to complete shit and back:The first few weeks or so was complete hell. Pinecone's API limits are brutal

  • took forever to get our vectors out, I think it was like 3 days? Maybe more? Meanwhile I'm trying to set up Postgre

SQL with pgvector and figure out the schema because their JSON metadata structure is nothing like normal database columns.Bulk loading actually went fine, then the HNSW index build crashed twice because I'm an idiot and didn't allocate enough RAM. Probably took me a week to get PostgreSQL settings somewhat tuned

  • lots of trial and error with maintenance_work_mem.Performance testing was where things really went to shit. Queries were way slower
  • like 20x or something insane. Spent days tweaking hnsw.ef_search from 40 all the way up to like 200 before things started working properly. I think it took me 3 weeks total? Maybe a month?The tricky part is rebuilding the metadata structure
  • Pinecone's JSON metadata becomes regular PostgreSQL columns. Budget like a month for a proper migration including performance testing. Your QPS will probably drop initially until you tune everything, but you'll save like $4k/month so it's worth it.
Q

What do I do when PostgreSQL query planner chooses seq scan instead of my expensive vector index?

A

Postgre

SQL's cost estimation for vector indexes was completely fucked before 0.8.0. Try SET enable_seqscan = false temporarily to force index usage, but the real fix is tuning your hnsw.ef_search parameter and making sure your work_mem is appropriate. Sometimes a seq scan actually is faster for small datasets or when you're returning most of the table.

Q

Can I use pgvector for real-time search without melting my server?

A

Define "real-time." Sub-100ms? Good luck, you'll need sacrificial offerings to the Postgre

SQL gods and a server made of unicorn tears. Under a second? Yeah, probably doable.HNSW queries are all over the fucking map

  • I've seen them range from like 20ms to 800ms+ on the same dataset depending on which random walk through the graph it takes. P99 latency will absolutely murder your SLA
  • I usually budget for like 10x my average query time because that's how chaotic this shit gets. Connection pooling with pgbouncer is mandatory or you'll run out of connections, and don't be an idiot like me and build HNSW indexes during peak traffic.
Q

Why does my similarity search return different results each time?

A

HNSW is an approximate nearest neighbor index. It uses a graph traversal algorithm that can take slightly different paths each time, especially with lower hnsw.ef_search settings. If you need deterministic results, either increase ef_search (slower but more consistent) or use exact search without indexes (very slow but perfectly consistent).

Q

How do I stop pgvector from eating all my server's memory?

A

Three main memory killers: 1) HNSW index building (set maintenance_work_mem appropriately), 2) Query work_mem (tune per connection), 3) The actual index size in shared_buffers.

If you see FATAL: out of memory or `DETAIL:

Failed on request of size X in memory context "Executor

State", you've hit the query memory limit. Reduce work_mem` or increase server RAM.Here's how to see what's actually happening:```sql-- See what's consuming memory right now

SELECT pid, usename, application_name, client_addr, backend_start, query_start, state, queryFROM pg_stat_activityWHERE state != 'idle' ORDER BY backend_start;```If you're running out of memory, consider half-precision vectors (halfvec) or fewer dimensions. Cutting from 1536 to 768 dimensions halves your memory usage.

Q

What happens when I upgrade PostgreSQL with pgvector installed?

A

Test EVERYTHING in staging first. pgvector indexes are tightly coupled to PostgreSQL's internal structures. Major PostgreSQL upgrades sometimes require rebuilding all vector indexes, which takes hours for large datasets. Minor updates are usually fine, but always have a rollback plan. The pgvector extension also needs to be compatible with your new PostgreSQL version.

Q

How do I handle vector search timeouts in production?

A

Set query timeouts at multiple levels: application connection timeout, PostgreSQL statement_timeout, and load balancer timeout. For queries that consistently timeout, check if the query planner is choosing a seq scan (bad), tune your hnsw.ef_search lower (worse accuracy but faster), or consider pre-computing and caching common searches.

Q

Why do my vector searches work in development but fail in production?

A

Usually resource constraints. Development uses small datasets that fit in memory, while production datasets trigger disk I/O during index scans. Also, development might not have concurrent queries competing for memory. Monitor pg_stat_statements to see actual query performance and tune shared_buffers, work_mem, and connection limits accordingly.

Q

Can I run vector search queries in parallel without locking issues?

A

Yes, reads are concurrent in Postgre

SQL. But be careful with writes

  • inserting vectors while building indexes can cause contention. Use CREATE INDEX CONCURRENTLY for building indexes on live tables, and consider batching inserts during off-peak hours. Monitor pg_locks if you suspect blocking issues.

Getting pgvector Running (Without Destroying Your Sanity)

Getting pgvector running is straightforward until you hit the gotchas they don't mention in the docs.

Cloud Providers (The Easy-ish Button)

Cloud Provider Comparison: AWS RDS/Aurora offers stability but slow updates. Google Cloud SQL provides good performance with reasonable pricing. Azure has decent pgvector support but poor documentation. Managed services like Supabase and Neon often offer faster feature adoption and better developer experience than big cloud providers.

Amazon RDS/Aurora

Google Cloud

  • Cloud SQL for PostgreSQL supports pgvector, decent performance, reasonable pricing
  • AlloyDB is Google's fancy PostgreSQL with better analytical performance (if you can afford it)

Azure

Managed PostgreSQL (Often Better Than Big Cloud)

  • Supabase: One-click enable, great for prototyping, gets expensive fast
  • Neon: Serverless PostgreSQL that doesn't completely suck
  • Timescale Cloud: Good if you need time-series + vectors
  • Crunchy Bridge: Reliable managed PostgreSQL from people who actually know PostgreSQL

Local Development Setup

Docker (Least Painful Option)
## Pull the official image (they update it regularly, unlike cloud providers)
docker pull pgvector/pgvector:pg17

## Run it with enough memory or you'll regret it later
docker run --name pgvector-dev \
  -e POSTGRES_PASSWORD=password \
  -p 5432:5432 \
  -m 4g \
  -d pgvector/pgvector:pg17

## Enable the extension
psql -h localhost -U postgres -c \"CREATE EXTENSION vector;\"
Homebrew (macOS)
## This usually works but might break on macOS updates
brew install pgvector
psql -d postgres -c \"CREATE EXTENSION vector;\"
Linux Package Managers

Ubuntu/Debian:

## Add the PostgreSQL APT repository if you haven't already
sudo apt install postgresql-15-pgvector
sudo systemctl restart postgresql
## Enable with: CREATE EXTENSION vector;

Red Hat/CentOS: sudo yum install pgvector_15
FreeBSD: pkg install postgresql15-pgvector

Compile From Source (If You Hate Yourself)
git clone --branch v0.8.1 https://github.com/pgvector/pgvector.git
cd pgvector
make  # Pray you have all the dev dependencies
sudo make install  # Hope it doesn't break your existing PostgreSQL

Check the GitHub releases for the latest version - they update it fairly regularly.

Your First Vector Query (That Won't Immediately Fail)

-- Enable the extension (obviously)
CREATE EXTENSION vector;

-- Create a table - note the dimension count matters for performance
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    title TEXT,
    content TEXT,
    embedding vector(1536),  -- OpenAI ada-002 dimensions
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Insert some test data (replace with actual embeddings)
INSERT INTO documents (title, content, embedding)
VALUES
    ('Test Doc', 'Some content', '[0.1, 0.2, 0.3, ...]'),  -- 1536 dimensions needed
    ('Another Doc', 'More content', '[0.2, 0.1, 0.4, ...]');

-- Create the index AFTER inserting data (faster than building empty index)
-- This will take a while and use a lot of RAM
SET maintenance_work_mem = '4GB';  -- Adjust based on your server
CREATE INDEX CONCURRENTLY documents_embedding_idx ON documents
    USING hnsw (embedding vector_cosine_ops)
    WITH (m = 16, ef_construction = 64);

-- Test a similarity search
SELECT title, embedding <=> '[0.15, 0.25, 0.35, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 5;

Production Configuration (Or Your Index Builds Will Fail)

Memory Settings That Actually Work:

-- For index building - adjust based on your RAM
SET maintenance_work_mem = '8GB';  -- 4GB minimum, I usually go higher

-- For queries - tune based on concurrent connections
SET work_mem = '256MB';  -- Start here, maybe 512MB if you have the RAM

-- pgvector specific settings
SET hnsw.ef_search = 40;  -- Start low, bump up if recall sucks
SET hnsw.iterative_scan = 'relaxed_order';  -- Fixes the filtering disaster

Index Building Best Practices:

-- Build indexes CONCURRENTLY on live tables (takes longer but doesn't block)
CREATE INDEX CONCURRENTLY items_embedding_idx ON items
    USING hnsw (embedding vector_cosine_ops)
    WITH (m = 16, ef_construction = 64);

-- Add regular B-tree indexes on columns you filter by
CREATE INDEX items_category_idx ON items (category);
CREATE INDEX items_created_at_idx ON items (created_at);

Client Libraries (Quality Varies)

The Python library is solid with proper NumPy integration:

pip install pgvector psycopg2-binary

Other languages have varying quality:

  • JavaScript/Node.js: Decent, actively maintained, doesn't crash on type errors
  • Go: Works fine for most use cases if you enjoy verbose SQL
  • Rust: Good if you're into fighting the borrow checker for database queries
  • Java: Exists, probably works, nobody's complained yet

Monitoring Your Vector Queries

PostgreSQL's built-in monitoring tools will save your ass:

-- Enable query stats if not already on
-- Add to postgresql.conf: shared_preload_libraries = 'pg_stat_statements'

-- See your slowest vector queries
SELECT
    query,
    calls,
    mean_time,
    max_time,
    total_time
FROM pg_stat_statements
WHERE query ILIKE '%<=>%' OR query ILIKE '%vector%'
ORDER BY mean_time DESC
LIMIT 10;

-- Check if your indexes are being used
SELECT
    schemaname,
    tablename,
    indexname,
    idx_scan,  -- Should be > 0
    idx_tup_read
FROM pg_stat_user_indexes
WHERE indexname LIKE '%embedding%'
ORDER BY idx_scan DESC;

-- Monitor index build progress (for long-running builds)
SELECT
    pid,
    now() - pg_stat_activity.query_start AS duration,
    query
FROM pg_stat_activity
WHERE query LIKE '%CREATE INDEX%';

Production Gotchas to Avoid

  1. Don't build indexes during peak traffic - HNSW index builds are CPU and memory hogs. Learned this when some genius (me) kicked off an index build at like 3PM and brought down our API for maybe 20 minutes because it ate every available CPU core. Boss was definitely not amused.

  2. Monitor your maintenance_work_mem - too low and builds fail with cryptic "could not extend file" errors, too high and you OOM the entire server. Start with like 4GB for million-vector datasets, maybe more.

  3. Test your queries with real data sizes - what works with 1k vectors might not work with 1M. A query that takes like 5ms with 10k vectors can take 5+ seconds with 1M vectors if your indexes aren't tuned properly.

  4. Set up proper monitoring - vector query performance is fucking unpredictable. I've seen HNSW queries vary from like 50ms to 2+ seconds on identical data because the graph traversal hits different paths. Your monitoring dashboards will look like a heart attack in progress.

  5. Have a rollback plan - vector indexes can't always be rebuilt quickly. Plan for like 2-4 hours to rebuild large HNSW indexes, maybe longer, and have a read replica ready if you need zero-downtime migrations.

  6. Watch for PostgreSQL version gotchas - pgvector 0.7.x had severe performance issues with PostgreSQL 15.3 that weren't fixed until 0.8.0. Always test in staging with your exact PostgreSQL version first.

With pgvector properly installed and tuned, you can build decent vector search applications. Just remember it's PostgreSQL first, vector database second - tune accordingly or prepare for 3AM debugging sessions when your "fast" vector queries start taking 30 seconds each.

Related Tools & Recommendations

pricing
Recommended

Why Vector DB Migrations Usually Fail and Cost a Fortune

Pinecone's $50/month minimum has everyone thinking they can migrate to Qdrant in a weekend. Spoiler: you can't.

Qdrant
/pricing/qdrant-weaviate-chroma-pinecone/migration-cost-analysis
100%
integration
Recommended

Using Multiple Vector Databases: What I Learned Building Hybrid Systems

Qdrant • Pinecone • Weaviate • Chroma

Qdrant
/integration/qdrant-weaviate-pinecone-chroma-hybrid-vector-database/hybrid-architecture-patterns
100%
tool
Similar content

Qdrant - Vector Database That Doesn't Suck

Explore Qdrant, the vector database that doesn't suck. Understand what Qdrant is, its core features, and practical use cases. Learn why it's a powerful choice f

Qdrant
/tool/qdrant/overview
88%
tool
Similar content

Milvus - Vector Database That Actually Works

For when FAISS crashes and PostgreSQL pgvector isn't fast enough

Milvus
/tool/milvus/overview
84%
tool
Similar content

ChromaDB - The Vector DB I Actually Use

Zero-config local development, production-ready scaling

ChromaDB
/tool/chromadb/overview
80%
tool
Similar content

FAISS - Meta's Vector Search Library That Doesn't Suck

Explore FAISS, Meta's library for efficient similarity search on large vector datasets. Understand its importance for ML models, challenges, and index selection

FAISS
/tool/faiss/overview
73%
tool
Similar content

PostgreSQL - The Database You Use When MySQL Isn't Enough

Explore PostgreSQL's advantages over other databases, dive into real-world production horror stories, solutions for common issues, and expert debugging tips.

PostgreSQL
/tool/postgresql/overview
69%
integration
Recommended

Making LangChain, LlamaIndex, and CrewAI Work Together Without Losing Your Mind

A Real Developer's Guide to Multi-Framework Integration Hell

LangChain
/integration/langchain-llamaindex-crewai/multi-agent-integration-architecture
64%
compare
Recommended

LangChain vs LlamaIndex vs Haystack vs AutoGen - Which One Won't Ruin Your Weekend

By someone who's actually debugged these frameworks at 3am

LangChain
/compare/langchain/llamaindex/haystack/autogen/ai-agent-framework-comparison
64%
integration
Recommended

Multi-Framework AI Agent Integration - What Actually Works in Production

Getting LlamaIndex, LangChain, CrewAI, and AutoGen to play nice together (spoiler: it's fucking complicated)

LlamaIndex
/integration/llamaindex-langchain-crewai-autogen/multi-framework-orchestration
64%
tool
Similar content

ChromaDB Troubleshooting: When Things Break

Real fixes for the errors that make you question your career choices

ChromaDB
/tool/chromadb/fixing-chromadb-errors
56%
tool
Similar content

OpenAI Embeddings API - Turn Text Into Numbers That Actually Understand Meaning

Stop fighting with keyword search. Build search that gets what your users actually mean.

OpenAI Embeddings API
/tool/openai-embeddings/overview
55%
tool
Similar content

Vector Databases - Stop Using Regular Databases for AI Embeddings

Discover why traditional databases fail for AI embeddings and semantic search. Learn how to choose the best vector database, including starting with pgvector fo

Pinecone
/tool/vector-databases/overview
48%
tool
Recommended

Pinecone Production Architecture Patterns

Shit that actually breaks in production (and how to fix it)

Pinecone
/tool/pinecone/production-architecture-patterns
43%
integration
Recommended

Vercel + Supabase + Stripe: Stop Your SaaS From Crashing at 1,000 Users

integrates with Vercel

Vercel
/integration/vercel-supabase-stripe-auth-saas/vercel-deployment-optimization
39%
alternatives
Recommended

Supabase Got Expensive and My Boss Said Find Something Cheaper

I tested 8 different backends so you don't waste your sanity

Supabase
/alternatives/supabase/decision-framework
39%
integration
Recommended

Vercel + Supabase Connection Limits Will Ruin Your Day

why my app died when 12 people signed up at once

Vercel
/brainrot:integration/vercel-supabase/deployment-architecture-guide
39%
tool
Similar content

Cassandra Vector Search - Build RAG Apps Without the Vector Database Bullshit

Learn how Apache Cassandra 5.0's integrated vector search simplifies RAG applications. Build AI apps efficiently, overcome common issues like timeouts and slow

Apache Cassandra
/tool/apache-cassandra/vector-search-ai-guide
37%
integration
Recommended

I Stopped Paying OpenAI $800/Month - Here's How (And Why It Sucked)

competes with Ollama

Ollama
/integration/ollama-langchain-chromadb/local-rag-architecture
36%
howto
Recommended

Deploy Weaviate in Production Without Everything Catching Fire

So you've got Weaviate running in dev and now management wants it in production

Weaviate
/howto/weaviate-production-deployment-scaling/production-deployment-scaling
36%

Recommendations combine user behavior, content similarity, research intelligence, and SEO optimization