Enterprise developer delivery · 2026-09-23
Recovery benchmark
How long a developer waits between the first call to the enterprise download API and a usable local copy of the anonymized database, per engine and dataset size. The measurements come from one developer machine and show the shape and order of magnitude, not a performance guarantee.
Which engines these numbers cover
Three engines were measured on 2026-09-23: PostgreSQL 15.19, MariaDB 10.11.19 and Redis 7.0.15.
Not measured. MongoDB, Apache Kafka and Redpanda, Microsoft SQL Server, Oracle Database and CouchDB have no figures here, and none are estimated from the three that do: their developer download and restore workflows have not been timed by this benchmark harness, so there is no comparable first API call measurement here. Valkey is not measured either — the Redis row is redis-server 7.0.15; no recovery benchmark was run against Valkey. MySQL and Percona Server are not measured separately from MariaDB, and the MariaDB figures are a logical dump, not the physical path. An engine’s absence here means only that: not measured. It is not a claim in either direction about how fast it would be.
What was measured
rows / keys: the number of rows or keys in the dataset. artifact: the size of the published artifact. All timing columns are in milliseconds. prepare and publish are the operator’s side, outside the developer total.
For each size (10,000 / 100,000 / 1,000,000 rows or keys), the harness:
-
prepare -- seeds the rows on the primary under a
hashrule and waits until the anonymized replica holds every one (the replication side; not part of the developer's wait). -
publish -- takes a fresh base and publishes it to the artifact catalog (
backup-base+backup-publish, orbackup-publishalone for Redis). This is the operator's schedule, reported separately. -
api --
GET /databases/default/latestwith a database-scoped token. -
download --
GET .../artifacts/{id}/download, one request. - verify -- SHA-256 of the bytes against the manifest.
-
restore -- unpack and restore with the artifact's own
restore.sh(PostgreSQL: a new instance on a spare port; MariaDB: an import into a fresh database; Redis: aredis-serverbooted on the.rdb, counted as usable only once it has finished LOADING) until every row is present.
developer total = api + download + verify + restore. Every harness asserts the restored copy carries no plaintext before reporting.
Results (milliseconds)
PostgreSQL 15.19 -- the artifact is a physical base of the replica server plus its WAL, which is why 10,000 rows already weigh 102 MB:
| rows | artifact | prepare | publish | api | download | verify | restore | developer total |
|---|---|---|---|---|---|---|---|---|
| 10,000 | 102 MB | 483 | 491 | 8 | 53 | 225 | 1209 | 1495 |
| 100,000 | 124 MB | 4465 | 531 | 10 | 61 | 271 | 2140 | 2482 |
| 1,000,000 | 339 MB | 40721 | 1403 | 10 | 129 | 751 | 1516 | 2406 |
MariaDB 10.11.19 -- the artifact is a logical .sql.gz; the import is the cost that grows with size:
| rows | artifact | prepare | publish | api | download | verify | restore | developer total |
|---|---|---|---|---|---|---|---|---|
| 10,000 | 154 KB | 1346 | 84 | 7 | 6 | 2 | 158 | 173 |
| 100,000 | 1.4 MB | 858 | 126 | 8 | 6 | 5 | 399 | 418 |
| 1,000,000 | 13.8 MB | 6469 | 897 | 7 | 11 | 40 | 2927 | 2985 |
Redis 7.0.15 -- an RDB snapshot over the replication protocol:
| keys | artifact | prepare | publish | api | download | verify | restore | developer total |
|---|---|---|---|---|---|---|---|---|
| 10,000 | 297 KB | 5846 | 4924 | 8 | 5 | 3 | 114 | 130 |
| 100,000 | 3.0 MB | 6659 | 5175 | 6 | 8 | 11 | 117 | 142 |
| 1,000,000 | 30.9 MB | 15682 | 5365 | 9 | 18 | 74 | 390 | 491 |
Caveats
- Localhost transfers: download times measure the API server, not a network. On a real link the download column scales with artifact size and bandwidth; the other columns do not change.
- The rows are narrow (an id, an e-mail, a 40-byte note). Wide rows and indexes grow the artifact and the restore.
- One run per cell, on a machine that was also running a mutation gate. Repeat before quoting a number to anyone.
- Three engines, three sizes, one artifact format each. Do not extrapolate from these rows to another engine, another artifact format or another machine — see which engines these numbers cover.