Labs
Each lab takes under an hour on a laptop and turns a claim from this mechanism into a number you measured yourself.
- 1
The one ratio: bytes touched versus bytes needed on your own disk
Random 200-byte reads from a 1 GB file, as plain and as 4 KiB aligned reads with the page cache bypassed; then 1,000 small range GETs against 10 large ones from an S3-compatible store.
Real systemDocker, Python - 2
Row versus column on the same table
10 million rows of 25 columns as CSV and as Parquet: file size, reading 2 columns, and reading one row by position.
MeasurePython with pandas, PyArrow - 3
Copy-on-write versus delete vector
5,000 row corrections on a table of 640,000-row files: copy-on-write rewrites against merge-on-read delta files, and scan time as deltas accumulate.
MeasurePython with DuckDB, PyArrow - 4
Clustering payoff: sorted versus random files
20 million rows as 20 Parquet files, random and sorted by (depot_id, scan_time): files a one-depot query must open, then after one unsorted append.
MeasurePython with PyArrow, pandas - 5
The composite-key rule (`C_a ≤ U`)
20 files sorted by (depot_id, scan_time) and by (user_id, scan_time): files a one-day query must open, alone and with a depot.
MeasurePython with PyArrow, pandas - 6
Z-order floor
A million 2-D points in 4,096 units: sorted on dimension 1, Z-ordered, and random; units a thin query on each dimension touches, and a 50/50 mix.
SimulatePython with NumPy - 7
Queue depth and the 0.7% reader
Random 4 KB reads from a 2 GB file with 1 to 128 requests in flight, page cache bypassed: IOPS against queue depth; then mmap.
MeasurePython