Servers' CPU metrics every 10 seconds, queried like a monitoring dashboard.
We use TSBS's data generator, unchanged, and its 15 query types, ported to SQL every system runs. We don't use TSBS's loaders or query runners: timebench loads the data and times the queries, so the numbers don't compare with published TSBS results.
After each system's maintenance, first run of each query in a fresh process. Systems maintain at different times: Timelake while it ingests, most others in a separate step after it, some not at all; the panel below says which, and how long the step after ingest took.
TunedRun of 2026-10-19
When each system maintains its tables, and how long its step after the last commit took.
The geometric mean over the 14 of 15 queries every reader answered. First run of every reader; lower is better.
First-run time in each of the 2 runs on this storage; dashed: a system read by another engine.
Right after the last commit, before any maintenance: the state readers see while data streams in.
TunedRun of 2026-10-19
The geometric mean over the 14 of 15 queries every reader answered. First run of every reader; lower is better.
First-run time in each of the 2 runs on this storage; dashed: a system read by another engine.
How each system took the data in and kept it in shape: load rate, commit times, maintenance, and what it stored.
TunedRun of 2026-10-19
median time per commit while streaming; lower is better
Committing is the time spent in all commits together. Storage is all files after maintenance, counting replaced files still waiting for cleanup.
| System | Committing | Commit p50 | Commit p95 | Maintenance | Files | Storage |
|---|---|---|---|---|---|---|
| Timelake | 194 s | 111 ms | 1157 ms | 5.4 s | 111 | 1.3 GB |
| Iceberg (PyIceberg) | 14 min | 975 ms | 1151 ms | 56.1 s | 886 | 2.3 GB |
| Lance | 214 s | 230 ms | 346 ms | 42.5 s | 97 | 1.8 GB |
| Parquet files | 185 s | 210 ms | 248 ms | 119 s | 4 | 955 MB |
Scroll the table sideways for every column.
Fresh readers during ingest: whether they saw every finished commit, and how fast dashboard queries ran under writes.
TunedRun of 2026-10-19
Every 15 s during ingest, a fresh reader ran the dashboard queries and checked the newest row it could see. Behind: probes that missed a commit that had already finished.
| System | Probes behind | Most behind | Dashboard query, median |
|---|---|---|---|
| Timelake | 0 of 51 | — | 46 ms |
| Iceberg (PyIceberg) | 0 of 21 | — | 83 ms |
| Lance | 0 of 28 | — | 1.66 s |
| Parquet files | 0 of 26 | — | 1.87 s |
Scroll the table sideways for every column.
Several clients at once after maintenance, each with its own reader, running the dashboard queries in turn.
TunedRun of 2026-10-19
After maintenance, 1, 4, 16 clients at once, each with its own reader open, running the dashboard queries in turn for 30 s. Queries per second over all clients, and the 95th percentile latency.
| System | 1 client | 4 clients | 16 clients |
|---|---|---|---|
| Timelake | 46.2 q/sp95 94 ms | 70.4 q/sp95 269 ms | 71.2 q/sp95 990 ms |
| Iceberg (PyIceberg) | 5.1 q/sp95 861 ms | 6.5 q/sp95 3.15 s | 2.0 q/sp95 34.5 s |
| Lance | 0.7 q/sp95 2.63 s | 1.0 q/sp95 6.48 s | 0.5 q/sp95 243 s |
| Parquet files | 5.4 q/sp95 897 ms | 7.2 q/sp95 3.30 s | 8.2 q/sp95 13.5 s |
Scroll the table sideways for every column.
Requests and storage at the store's list prices; machines are not included.
AWS S3TunedRun of 2026-10-19
Ingest is scaled to a month of data arriving at this rate.
| System | Ingest, per month | Storage, per month | Per query |
|---|---|---|---|
| Timelake | $0.44 | $0.028 | $0.000031 |
| Iceberg (PyIceberg) | $1.07 | $0.049 | $0.000022 |
| Lance | $4.91 | $0.039 | $0.00090 |
| Parquet files | $0.69 | $0.020 | $0.000026 |
Scroll the table sideways for every column.
Left out of the rankings above; each query's list says which readers it lost.
TunedRun of 2026-10-19
Each system is written, maintained, and read the way its own docs suggest, on the same data. An entry in a ranking is a system, or a system and the reader that queried it, such as Lance + DuckDB.
Every system runs in two tunings. Tuned: each system as its docs recommend, precomputation included. Default: each system as installed. Results are tuned unless a section's switch says otherwise.
Timelake's own writer: Iceberg tables of sorted Parquet, compacted as it appends.
Plain Iceberg tables written by PyIceberg appends: what a Firehose stream into S3 Tables writes.
Lance datasets, appended commit by commit.
Parquet files without a table format: a new file per commit, as an S3 sink writes them.
TimescaleDB, a PostgreSQL database for time series, on its server's own disk.
Each system's own reader after maintenance: the geometric mean of first runs over the queries it completed in each run. The weekly run adds a point each week.
2 runs
3 runs
Hover or tap ⓘ for the machine, the commit and every version.