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

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.