Skip to content

#postgresql

6 posts on this topic, newest first. all tags →

.2026

6 posts, newest first.

Hybrid search with pgvector got worse until I added BM25

The hybrid query most tutorials show, Postgres full-text search fused with pgvector, scored worse on two public benchmarks than vector search alone. With a real BM25 index as the keyword half, the same fusion gave the best result I measured, in under 3 ms a query. Here are the numbers for seven ways to search, and the query shapes that made the fused one 15 times slower until I found them.

postgresqlsearchrag+2 more
18 min read20 min listen

Upgrading PostgreSQL 16 to 18 with zero downtime: the whole runbook

A major version upgrade with a write pause you measure in seconds, instead of an outage you measure in hours. The plan, the preflight queries that catch what will bite you, building the new cluster from a standby with pg_createsubscriber, the sequence trap, schema changes during the window, the cutover script through PgBouncer, a rollback you can actually take, and what PostgreSQL 19 removes from this list.

postgresqldatabaseoperations+2 more
16 min read21 min listen$2.00

The outbox pattern without a relay

The transactional outbox solves the dual write problem and hands you a second one: a relay service you have to deploy, watch and keep pointed at the right database. ulak moves the relay into PostgreSQL as background workers. This is how it claims, delivers and recovers, and the trade it asks you to accept for that.

postgresqloutboxdistributed-systems+2 more
12 min read16 min listen

Just use Postgres, until it actually hurts

The queue, the cache, the search index, the vector store, the job scheduler and the analytics table for a product with 40,000 daily users all live in one Postgres 18 instance, and that was the plan from the start. Here's what each piece looks like, what it costs, and the three specific signals that would make me move one of them out.

postgresqlarchitecturedatabase+1 more
8 min read10 min listen

UUIDv7 and the end of the random primary key

PostgreSQL 18 ships uuidv7() in core. It looks like a small convenience function, and it ends a decade-long argument about UUID primary keys. The numbers from a 200 million row table show why. The migration path is included, along with the one gotcha around the timestamp you can extract.

postgresqldatabaseperformance+1 more
11 min read14 min listen

RAG is a search problem wearing a costume

The internal docs assistant answered confidently and was wrong a third of the time. Everyone blamed the model, but the model was fine. Retrieval was returning the right document eleventh out of ten. Fixing it took six weeks of ordinary search engineering, and none of it touched a prompt.

ragsearchpostgresql+1 more
10 min read13 min listen