Notes from running PostgreSQL in production. I'm the architect of SupraScan, a blockchain indexer running 500–1,000 TPS on a database that grew to 10 TB before I cut it to 2.7 TB.
Content Type
All three trade exactness for memory, which is why they get mixed up. A Bloom filter answers "have I seen this wallet?", a reservoir answers "give me a fair sample of the stream", and HyperLogLog answers "how many distinct wallets?". Pick the wrong one and you don't get a slightly worse answer. You get a confident answer to a question you didn't ask.
Node.js patched CVE-2026-111497, a High-severity Brotli decoder flaw, on October 21, 2026. I traced the built-in fetch() through Undici to show how a response reaches that decoder even when your code never imports zlib, and wrote up the checklist for verifying what production actually runs.
Before adding Redis, BullMQ, or SQS just to distribute background work, look at the database you already run. PostgreSQL's FOR UPDATE SKIP LOCKED lets multiple workers claim different jobs concurrently. Learn how to handle expired leases, retries, MVCC bloat, and notification-based wake-ups, and when a dedicated queue is the better choice.
A B-tree is cheap to search and expensive to keep sorted. Here’s what reads, inserts, updates and deletes actually do inside one in PostgreSQL, and how that should decide the index on every table of a blockchain indexer, from wallet history to balances to NFTs.
Turning blockchain indexer data into a paid API is easy. Keeping API traffic from slowing your explorer or ingestion is the hard part. This post presents a production architecture using replica pools, read models, finality-aware caching, Redis quotas and per-plan bulkheads.
You bumped the base image or rebuilt a replica on a newer OS. No deploy, no migration. Then a unique index lets in a duplicate and an indexed lookup misses a row you can see. Here's how collation drift breaks B-tree indexes, how to prove it with amcheck, and the fix order that doesn't silence the only alarm.
Random UUIDv4 keys look harmless until the table grows. Every insert lands on a random B-tree leaf page, the index outgrows the buffer cache, pages split half-empty, and full-page writes inflate WAL after every checkpoint. A 10M-row PostgreSQL 18 benchmark shows the cost, and why native uuidv7() recovers almost all of it without giving up distributed ID generation.
Our PostgreSQL blockchain indexer's TOAST table grew past 5TB because unbounded JSONB arrays kept getting bigger. Here's what TOAST was costing us, how to measure it, and how we moved hot JSONB fields into normal columns without taking the indexer offline.
An UPDATE returns in two milliseconds, but underneath, Postgres just ran WAL logging, checkpoint bookkeeping, wait-event tracking, vacuum, and ANALYZE to make that write durable, recoverable, and still fast to plan. Here's what each of those five processes actually does, and which one is usually behind the latency spike that has no slow query in sight.
New posts and case studies on PostgreSQL internals and production incidents, plus a short digest when new course modules go live. No spam, unsubscribe in one click.
Prefer a feed reader? Follow via RSS