Skip to content

Build1 publisher2 min readPublished

A read replica moves the dashboard load onto the same 8 KB row-store pages

ClickHouse's own guide says Postgres replicas inherit the primary's row-oriented limits, and MotherDuck models a 50ms dashboard aggregation growing to five seconds at tens of millions of rows before it times out.

The Engineer · Build desk

Illustration accompanying A read replica moves the dashboard load onto the same 8 KB row-store pages

What happened

  • An engineer writing on dev.to reports adding a Postgres read replica to take concurrent dashboard reads off the primary, and says the replica began overheating instead.
  • MotherDuck modelled a dashboard aggregation taking 50ms on a small table and five seconds at tens of millions of rows, timing out once concurrent load arrives.
  • A retrospective of a September 2026 incident describes a replica hit by hundreds of similar aggregations at once, with WAL replay contending against queries for CPU and memory.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint Instance size cannot buy column pruning or compression, so the only lever a replica offers an analytics team is the same full-row reads on faster hardware.
  • cost The compensation shows up on the invoice: an instance provisioned for the dashboard spike is paid for during the hours it sits idle, by the team that chose one engine for two jobs.
  • decision Teams still pointing customer-facing aggregations at a replica have to price a second, column-oriented engine against another instance upgrade, and decide which data stays transactional.
  • contradiction The page layout is a property of Postgres, but the latency curve comes from MotherDuck and the verdict on replicas from ClickHouse, both of which sell the replacement, so the five-second figure needs your own row width and write rate before it says anything.

A dashboard query that selects two columns still reads whole rows. Postgres lays data out in 8 KB pages, with a fixed 23-byte header on every tuple [4]. The narrow SELECT gets the wide row [5]. Adding a replica changes which CPU does that work, and the storage format it works on is the primary's, copied [15].

ClickHouse's engineering team wrote in a May 2026 guide that "While being beneficial in terms of high availability, performance, and horizontal read scalability, Postgres read replicas share the row-oriented limitations of the primary. They don't compress data effectively for analytics, and they still require heavy B-tree indexes that bloat memory" [3]. ClickHouse sells the column store that would replace the replica, so ClickHouse is an interested party describing a competitor's engine, and the page geometry is a property of Postgres either way [4].

The figure carrying the argument comes from MotherDuck, which modelled an aggregation taking 50ms on a small table and five seconds at tens of millions of rows, then timing out once concurrent load arrives [8][9]. Latency rises a hundredfold [16]. Against the sub-100ms threshold the post uses for customer-facing analytics [10], five seconds is at least fifty times over budget [17]. The curve is modelled. No one's production workload was measured. For the number to transfer, your aggregation has to scan a comparable row count on a replica that is simultaneously replaying the primary's WAL, at the concurrency described in a September 2026 incident retrospective: "hundreds of similar aggregations running at once" [6].

In that incident, WAL replay and fast queries contended for the same CPU and memory, and the fast queries became "painfully slow" [7]. The post describes the retrospective without naming the team or giving the replica's row count [18].

Brandur Leach and Gunnar Morling have made the adjacent point about queues, according to the post: running queue-like workloads alongside normal OLTP in the same Postgres produces MVCC bloat, index fragmentation and WAL pile-up [11].

The usual compensation is hardware. The example given is an AWS r8gd.4xlarge over-provisioned for dashboard spikes and mostly idle at 3am [12].

What the post recommends instead is a column-oriented serving layer such as ClickHouse for the aggregations, which compresses data heavily and reads only the columns a query needs [13]. The transactional store stays put. "I still choose to store my transactional data in Postgres, and I will defend that choice," the author wrote [14].

What to watch

  • Whether MotherDuck or ClickHouse publishes the workload behind the 50ms-to-5s curve: row width, index set, and write rate on the primary.
  • Whether the September 2026 incident retrospective appears in full, with the team named and the replica's instance size and row count.
  • What row counts and concurrency levels readers report back to the post, which asked for the point at which their replica gave out.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories