Build1 distinct publisher2 min readUpdated
A workout app recomputes every coaching verdict from raw logs. That stayed affordable only after seven tables got indices, and the observability added to prove it had been dropping every span.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The mechanism here is unglamorous. Room's relation fetches on the analyzer path had nothing to seek on, so each verdict recomputation full scanned `set_logs`, the largest table in the schema and the one sitting on the hot path [5]. Compute-on-read is not what made that slow. What made it slow is that the cost of a single read scaled with everything the lifter had ever logged, so a fresh install looked healthy while a long-tenured user paid the whole bill [6].
The arithmetic on the fix: 112.3 ms removed from one session read [16], leaving the new figure at 5.7 percent of the old [17]. Divide the two published numbers and you get 17.5x rather than the 17.4x in the writeup [18], which is what one decimal place of rounding buys and not worth arguing about. The number the post does not give is the one I would want next: which query stayed where it was [4]. That is the point where indexing stops being the answer and caching starts looking attractive again. The migration covered seven tables against eleven entities in the schema [7][13], so four entities came out of it with no new index [19].
Then the trap, in the author's own framing. Room builds a fresh install from the `@Entity` annotations and an upgrade from the migration's raw SQL, two independent descriptions of the same schema with no framework check between them [8]. The index that makes this read path affordable now exists in two places, in two syntaxes, kept in step by hand. Drift does not throw an error. It means the user who installed today and the user who upgraded today are running different databases, and only one of them is fast.
The ordering of the observability half is what most readers will get backwards. All four read-path defects were found by reading code on 2026-07-25, before Sentry existed in the project at all [9][15]. The tool arrived afterwards and turned up three different bugs, one of which was its own ingest: five spans sent, zero accepted, five rejected as invalid [10]. Ship the index work, open the dashboard to confirm the timing moved, and you are reading an empty chart as if it were agreement. The Cloudflare Worker had already failed in the same shape, with a top-level `console.error` and a generic 500 that records nothing in production [12]. Two channels, both trusted, neither checked at the far end.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
With a five-year history, a session read took 119.1 ms because eleven Room entities had zero indices between them.
Adding indices took the session read to 6.8 ms, a 17.4x improvement, and one query got no faster at all.
After the project was instrumented, Sentry surfaced three bugs the author did not know about, including one where Sentry had been silently discarding every trace sent to it: zero accepted, five invalid.
WhyRep recomputes every coaching verdict from raw training logs on read; nothing is precomputed, so there is no cached judgement to go stale when the rules change, and every read walks the history.
Every relation fetch full scanned set_logs, the table holding every set the lifter has performed, described as the largest table in the schema by a wide margin and the one on the hot path.
The missing-index cost is invisible on a fresh install and gets worse every month, which punishes the most committed users first.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific and internally consistent, but single-author and unreproducible
The account is unusually concrete for a self-report: exact timings, named indices, inline migration SQL, file-and-line defect locations, and test code that distinguishes index existence from planner usage. Against that, every figure comes from one author in one article about a private repository, with no device, dataset-construction, or run-count methodology, no identification of the query that did not improve, and a body that is truncated before the Sentry section so the three post-instrumentation bugs exist only as a TL;DR summary.
One private hobby project, no external users disclosed
Adoption evidence is confined to the author's own app: a schema migration written into one codebase, one benchmark run by its author, and one Sentry integration. No installs, downloads, active users, third-party deployments, or external practitioners applying the pattern appear anywhere in the supplied material, and the app is explicitly account-free and local-first, so no server-side usage disclosure exists either.
Mildly overstated framing over an honest, narrow result
The multiplier headline invites generalization from a single hand-built five-year history on undisclosed hardware to Room performance broadly, and the migration covers seven of eleven entities without addressing the rest. Offsetting that, the article is conspicuously self-limiting: it sequences the performance pass before Sentry existed and declines to credit the tool for the index findings, admits one query got no faster, and treats the annotation-versus-migration trap rather than the index as the real lesson. The residual gap is small and comes from framing breadth, not from claims the text fails to support.
Contest submission promoting the author's own product, self-measured
The first line identifies the piece as a submission for DEV's Summer Bug Smash, so there is a direct contest incentive to present a dramatic before/after arc. The author is also the developer of the product being profiled, the repository is private so diffs and timings are disclosed selectively by the interested party, and both the defect list and the improvement measurement are authored by the same person. Mitigating factors are the volunteered non-improving query and the explicit refusal to credit Sentry for earlier findings, which cut against pure promotion.
Low: single publisher, single self-reported source, truncated body
One article from one publisher, written by the subject, about a private codebase, with no corroborating source in the cluster and no methodology to re-run. The engineering mechanisms described, notably Room's split schema derivation and the value of asserting EXPLAIN QUERY PLAN output, are checkable in principle by any reader with a Room project, which supports moderate confidence in the lesson even where confidence in the specific numbers stays low.
build
"No key, no SDK" is not a guarantee on Android: the manifest merger gets there first1 distinct publisher
build
One game, two codebases: where parity belongs when you ship native on iOS and Android1 distinct publisher
build
Sentry's defaults shipped a lifter's shoulder injury while the scrubbing policy passed its tests1 distinct publisher
build
One chat, four cards: three stacked causes and why each correct fix looked broken1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 22, 2026