baseline row shape
Shows framework overhead with very little field-mapping noise, so identity-map, query builder, and per-record object cost dominate.
mixed nullable and cast-heavy fields
Wide records amplify hydration, casting, dirty-checking, and serialization overhead. Frameworks with expensive attribute normalization usually spread out here.
narrow scalar writes
A near-floor for typed persistence. If an ORM is still slow here, the cost is usually framework machinery rather than payload complexity.
numeric conversion and precision paths
Decimal and floating-point mapping can trigger extra normalization work, especially on update verification and dirty-state comparison.
predictable text hydration
Fixed-length text stresses text field assignment without the variability of large blobs, so column-count and hydration strategy matter more than payload churn.
application-style text records
This is the closest to a real CRUD app payload. Variable strings and notes fields widen the gap between lightweight row mappers and heavier active-record layers.
- Warmup vs hot runs
- Run 1 is a warmup pass. Hot-path rankings exclude it so adapter boot, metadata discovery, and first-query setup do not drown out steady-state behavior.
- Insert and indexed schemas
- Indexed variants make inserts more expensive because each row write updates secondary indexes. ORMs that already have heavy unit-of-work overhead get exposed harder there.
- Read all vs read probes
- Read All rewards efficient bulk hydration. Random and tail probes reveal per-query setup cost, identity lookup behavior, and how much work happens for tiny result sets.
- Update with verification
- Updates are followed by read-back verification. That means slow dirty-checking, full-row writes, cast normalization, and post-update reads all feed into the total.
- Delete phase
- Delete cost is not just delete. The harness verifies the row is actually gone, so frameworks with slow teardown or follow-up lookup behavior pay twice.
- Total runtime
- Total runtime is a whole-machine workload number: init, insert, every read shape, every update shape, verification passes, and delete.