Timelaketimelake
DocsBenchmarksRoadmapSpecContribute
Apache 2.0 ·
TimelaketimelakeThe open time-series lakehouse.
v0 · Apache 2.0 · Contribute · GitHubBuilt on Apache Arrow, Apache DataFusion, Apache Parquet, and Apache Iceberg.
Benchmarks

TSBS DevOps

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.

Methodology TSBS on GitHub
After maintenanceRight after ingestIngest and maintenanceWhile ingestingConcurrent dashboardsCostFailed or timed outWhat each entry meansOver time

After maintenance

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.

Tuned·Run of 2026-10-19

Maintenance before these queries

When each system maintains its tables, and how long its step after the last commit took.

  • TimelakeWhile it ingests: each append compacts what it can. The step after ingest only finishes what's left.5.4 s
  • Iceberg (PyIceberg)A separate job after ingest; until it runs, readers see every small file.56.1 s
  • LanceA separate job after ingest.42.5 s
  • Parquet filesA separate job after ingest.119 s
Rank by
QueryTimelakevs fastest

All queries

The geometric mean over the 14 of 15 queries every reader answered. First run of every reader; lower is better.

  1. 198 ms
  2. 322 ms1.6×
  3. 544 ms2.7×
  4. 630 ms3.2×
  5. 728 ms3.7×
  6. 2.12 s11×
  7. 2.52 s13×

Time over runs

First-run time in each of the 2 runs on this storage; dashed: a system read by another engine.

Right after ingest

Right after the last commit, before any maintenance: the state readers see while data streams in.

Tuned·Run of 2026-10-19

Rank by
QueryTimelakevs fastest

All queries

The geometric mean over the 14 of 15 queries every reader answered. First run of every reader; lower is better.

  1. 201 ms
  2. 454 ms2.3×
  3. 555 ms2.8×
  4. 1.60 s8.0×
  5. 4.59 s23×
  6. 5.77 s29×
  7. 6.05 s30×

Time over runs

First-run time in each of the 2 runs on this storage; dashed: a system read by another engine.

Ingest and maintenance

How each system took the data in and kept it in shape: load rate, commit times, maintenance, and what it stored.

Tuned·Run of 2026-10-19

Commit

median time per commit while streaming; lower is better

  1. 111 ms
  2. 210 ms1.9×
  3. 230 ms2.1×
  4. 975 ms8.8×

Per system

Committing is the time spent in all commits together. Storage is all files after maintenance, counting replaced files still waiting for cleanup.

SystemCommittingCommit p50Commit p95MaintenanceFilesStorage
Timelake194 s111 ms1157 ms5.4 s1111.3 GB
Iceberg (PyIceberg)14 min975 ms1151 ms56.1 s8862.3 GB
Lance214 s230 ms346 ms42.5 s971.8 GB
Parquet files185 s210 ms248 ms119 s4955 MB

Scroll the table sideways for every column.

While ingesting

Fresh readers during ingest: whether they saw every finished commit, and how fast dashboard queries ran under writes.

Tuned·Run of 2026-10-19

Per system

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.

SystemProbes behindMost behindDashboard query, median
Timelake0 of 51—46 ms
Iceberg (PyIceberg)0 of 21—83 ms
Lance0 of 28—1.66 s
Parquet files0 of 26—1.87 s

Scroll the table sideways for every column.

Concurrent dashboards

Several clients at once after maintenance, each with its own reader, running the dashboard queries in turn.

Tuned·Run of 2026-10-19

Per system

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.

System1 client4 clients16 clients
Timelake46.2 q/sp95 94 ms70.4 q/sp95 269 ms71.2 q/sp95 990 ms
Iceberg (PyIceberg)5.1 q/sp95 861 ms6.5 q/sp95 3.15 s2.0 q/sp95 34.5 s
Lance0.7 q/sp95 2.63 s1.0 q/sp95 6.48 s0.5 q/sp95 243 s
Parquet files5.4 q/sp95 897 ms7.2 q/sp95 3.30 s8.2 q/sp95 13.5 s

Scroll the table sideways for every column.

Cost

Requests and storage at the store's list prices; machines are not included.

AWS S3·Tuned·Run of 2026-10-19

On AWS S3

Ingest is scaled to a month of data arriving at this rate.

SystemIngest, per monthStorage, per monthPer 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.

Failed or timed out

Left out of the rankings above; each query's list says which readers it lost.

Tuned·Run of 2026-10-19

Per reader

  • Parquet files + DataFusion2lastpoint (right after ingest), lastpoint (after maintenance)

What each entry means

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

Timelake's own writer: Iceberg tables of sorted Parquet, compacted as it appends.

Written
Table.append per commit, with inline maintenance (compaction, dedup, retention).
Maintenance
timelake maintain: each partition rewritten into one sorted file, rollups refreshed.
When
While it ingests: each append compacts what it can. The step after ingest only finishes what's left.
Tuned
The workload's rollups, and its queries in Timelake's own functions where the docs write them that way.
Read by
Timelake: Timelake's own reader (the CLI, on DataFusion), with dedup on read, its indexes and its cache.DuckDB: Timelake's tables read by plain DuckDB, with no Timelake software: it sees rows that arrived twice until compaction removes them.

Iceberg (PyIceberg)

Plain Iceberg tables written by PyIceberg appends: what a Firehose stream into S3 Tables writes.

Written
PyIceberg append per commit, tables partitioned by day.
Maintenance
A bin-pack rewrite of small files, S3 Tables' default compaction.
When
A separate job after ingest; until it runs, readers see every small file.
Tuned
A sort order on the series key and time, and compaction that sorts each day by it.
Read by
DuckDB: DuckDB reading the files directly with its Iceberg, Lance or Parquet support: no Timelake software.

Lance

Lance datasets, appended commit by commit.

Written
write_dataset in append mode per commit.
Maintenance
compact_files, then cleanup_old_versions.
When
A separate job after ingest.
Tuned
Its maintenance, then a B-tree index on the series key and a zone map on time. Default: no maintenance.
Read by
DuckDB: DuckDB reading the files directly with its Iceberg, Lance or Parquet support: no Timelake software.DataFusion: Apache DataFusion reading the files directly, from Python.

Parquet files

Parquet files without a table format: a new file per commit, as an S3 sink writes them.

Written
A Parquet file per commit in a folder per day.
Maintenance
Each day rewritten into one sorted file.
When
A separate job after ingest.
Tuned
Its maintenance. Default: the files as written, no maintenance.
Read by
DuckDB: DuckDB reading the files directly with its Iceberg, Lance or Parquet support: no Timelake software.DataFusion: Apache DataFusion reading the files directly, from Python.

TimescaleDB

TimescaleDB, a PostgreSQL database for time series, on its server's own disk.

Written
COPY per commit into hypertables; rows that arrive twice are skipped.
Maintenance
Every chunk converted to its columnstore.
When
A separate step after ingest (in production, a background policy on older chunks).
Tuned
An index on (series, time), the columnstore, and continuous aggregates its tuned queries read. Default: the hypertable as created, row store.
Read by
PostgreSQL: SQL over PostgreSQL's protocol.

Over time

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.

AWS S3

2 runs

Local disk

3 runs

All runs

Hover or tap ⓘ for the machine, the commit and every version.

  • 2026-10-19AWS S3Timelake, Iceberg (PyIceberg), Lance, Parquet filesweekly
  • 2026-10-19Local disk · bulk loadTimelake, Iceberg (PyIceberg), Lance, Parquet files, TimescaleDBweekly
  • 2026-10-19Local diskTimelake, Iceberg (PyIceberg), Lance, Parquet files, TimescaleDBweekly
  • 2026-10-19Local diskTimelakejsonl
  • 2026-10-16AWS S3Timelake, Iceberg (PyIceberg), Lance, Parquet filesweekly
  • 2026-10-16Local disk · bulk loadTimelake, Iceberg (PyIceberg), Lance, Parquet files, TimescaleDBweekly
  • 2026-10-16Local diskTimelake, Iceberg (PyIceberg), Lance, Parquet files, TimescaleDBweekly