UmurInan
PostgreSQL Topic

PostgreSQL

Postgres is the database I default to, and most of these posts are about the failure modes you only meet at scale: query planner surprises, NULL semantics, replica staleness, deadlocks, partitioning trade-offs, and the indexes you thought you had.

Database

Posted on Jun 3, 2026

Postgres Won the Database War. Now What?

Postgres passed MySQL on the Stack Overflow survey. 'Postgres for everything' became the default. Where that gravity helps, where it quietly stops, and my rule.

Read more
Backend

Posted on Jun 2, 2026

You're Running Kafka for Three Topics

Kafka is a commit log for high-throughput streaming. Three topics at 10 msg/sec is not that. The operational tax you didn't price, and the tool that fits.

Read more
Database

Posted on May 31, 2026

DuckDB Ate Your Analytics Pipeline and That's Fine

Most 'big data' analytics is tens of gigabytes, not terabytes. DuckDB runs it on one node in seconds, no cluster. When single-node wins and where it bites.

Read more
Database

Posted on May 26, 2026

pgvector at 10 Million Rows Is a Different Animal

pgvector is great at 100k rows. At 10 million it's a different animal. IVFFlat vs HNSW, storage math, the quantization escape, and what actually breaks.

Read more
Backend

Posted on May 23, 2026

The Postgres Index That Never Gets Used

Postgres indexes accumulate. Every perf push adds one. Almost no team removes any. How to find the unused ones and why their write cost is the bigger problem.

Read more
Backend

Posted on May 17, 2026

The Long Transaction That Ate Your Postgres

An idle transaction pins the xmin horizon. Autovacuum cannot reclaim anything newer than it. Tables bloat. Queries slow. Here is the fix every install needs.

Read more
Backend

Posted on May 10, 2026

Hibernate's ddl-auto Is Not a Migration Tool

ddl-auto: update silently adds columns and never drops them. What it does to your schema, why it fails on renames, and how to safely replace it with Flyway.

Read more
Backend

Posted on May 9, 2026

Your Replica Is Lying To You

Read replicas trade staleness for throughput. Replication lag, read-your-writes, and the staleness window nobody tracks: these are where things actually break.

Read more
Backend

Posted on May 6, 2026

UTC In the Database Was the Easy Part

Storing UTC is the easy part. Display, recurring events, DST, date-only fields, and scheduled jobs: the real bugs live in the conversion layer, not the storage.

Read more
Backend

Posted on May 1, 2026

Two Transactions Walk Into a Lock

Deadlocks are not exotic. They are predictable consequences of lock order. Here are the patterns, the fixes, and the eleven characters that ended one outage.

Read more
Backend

Posted on Apr 25, 2026

The Composite Index Nobody Can Read

Your composite index covers every column but EXPLAIN still shows a full scan. Column order, not column presence, determines whether PostgreSQL uses the index.

Read more
Backend

Posted on Apr 21, 2026

Database Isolation Levels Are a Contract, Not a Dial

Isolation levels define which anomalies you tolerate, not how much correctness you get. The SQL standard and what databases implement diverged decades ago.

Read more
Backend

Posted on Apr 19, 2026

The NULL Trap

NULL is a three-valued logic system that corrupts aggregations, breaks NOT IN subqueries, and hides rows from WHERE clauses. It is not just a missing value.

Read more
Backend

Posted on Apr 17, 2026

EXPLAIN ANALYZE Lies to You

PostgreSQL's EXPLAIN ANALYZE tells you the plan looks fast. It doesn't tell you the timing is cached, the estimates are stale, or the cost isn't milliseconds.

Read more
Backend

Posted on Apr 16, 2026

Database Partitioning: The Decision You Can't Undo

Range vs hash partitioning, hot spots, and the re-partitioning trap. Partitioning looks like a scaling win until you find out you cannot undo the choice.

Read more
Backend

Posted on Apr 15, 2026

Connection Pool Tuning: A Practical Guide

HikariCP's defaults look sensible until your app hits production load. Here's how to actually size your connection pool using Little's Law, not guesswork.

Read more
Backend

Posted on Apr 12, 2026

Transactions Don't Fix Race Conditions

Wrapping code in a transaction doesn't make concurrent operations safe. Here's what transactions guarantee and what race conditions they let slip through.

Read more
Backend

Posted on Apr 10, 2026

Soft Deletes Are a Trap

Adding is_deleted to your tables feels harmless. Here's what it actually costs: broken constraints, query pollution, index bloat, and cascading confusion.

Read more
Backend

Posted on Apr 2, 2026

The Database Is Not Your Message Queue

Polling a status column every few seconds works until it does not. Here is why your database makes a terrible message queue and what to reach for instead.

Read more
Backend

Posted on Mar 27, 2026

Database Indexes Explained for People Who Keep Forgetting

You've read about database indexes before. You've forgotten most of it. Here's the practical guide you'll actually remember, with PostgreSQL examples.

Read more
Backend

Posted on May 19, 2026 advanced

Spring Data Derived Queries: Crossing Boundaries

Nested traversal in Spring Data derived queries: the underscore rule, the distinct-join trap, the same-collection trap, projections, EntityGraph, streams.

Read more
Backend

Posted on May 19, 2026 advanced

Spring Data Derived Queries: The Single-Entity Toolkit

Spring Data writes JPQL from your method names. The full single-entity keyword set: equality, comparison, string ops, null, In, OrderBy, Top, Pageable, countBy.

Read more
Backend

Posted on May 16, 2026 advanced

HikariCP in Production: Tuning, Monitoring, and pgbouncer

Tune HikariCP for production Spring Boot 4 services on Postgres. Little's Law sizing, the properties that matter, monitoring signals, pgbouncer fronting.

Read more
Database

Posted on May 9, 2026 intermediate

PostgreSQL JSONB Deep Dive: Operators, Indexes, and the Tradeoffs Nobody Told You About

JSONB operators, GIN vs expression indexes, and the cost of JSONB over typed columns - all proved with EXPLAIN ANALYZE on 200k Postgres rows. Tests in the repo.

Read more
Database

Posted on Apr 25, 2026 intermediate

Database Indexes Explained: A PostgreSQL Walkthrough With EXPLAIN ANALYZE

B-tree, composite, partial indexes proved with EXPLAIN ANALYZE on 500k Postgres rows. Plus the three ways EXPLAIN ANALYZE lies to you. Tests in the repo.

Read more