Version 0.6-draft. The method will change before version 1. Every change is listed in CHANGELOG.md.

The runner

One runner runs every test on every system. Each system plugs in through a small adapter. The adapter starts and stops the system, loads files, writes cells, reads results and changes the model.

An entry is a system plus one way of running it. For example, a database can have one entry that computes on read and another that stores results.

Timing

The runner times everything itself, with a monotonic clock. It never uses times a system reports.

Test kindTimer startsTimer stops
ReadBefore the requestWhen the whole answer is in the runner's memory
WriteBefore the writeWhen the proving read returns the new value
LoadWhen the system starts reading the filesWhen the proving read returns and sync has finished
Model changeBefore the changeWhen the proving read returns the new value

Durability and tags

A durable write survives a crash. Where a system has a setting for this, its entry turns it on. Every result is tagged durable or non-durable.

Embedded systems run inside the runner's process. Servers pay for a network round trip. Both share one table, tagged embedded or server.

Reset

The machine

Every result comes from one Google Cloud n2d-standard-4: 4 vCPUs, 16 GB of memory and an SSD persistent disk. It is small on purpose, because memory often decides whether a model fits. This choice is not final until every system has had a trial run.

Repeats

Test kindRunsReported
Read1 cold, after a restart and a cleared OS cache. Then 5 warm.Cold time, and median warm time
Single-cell write20, each on a new cell, after 1 warm-up. Fewer if a test has fewer cells.Median and 95th percentile
Bulk write, load, model change3, each from the snapshotMedian

Reads run in a random order from a fixed seed. Every raw time is published.

Scores

score = (c + t) / (c + best)

t is the system's time and best is the fastest system's time. c is 10 ms, so differences no user could feel don't count as big ratios. Lower is better, and 1 is the best.

These follow ClickBench. The 10 ms constant will be reviewed once there are real results.

Caches and stored results

Planning engines keep results up to date, so stored results are allowed. This covers materialized views, incremental views and stored totals. Their build and upkeep time counts inside the timed loads and writes. They must be correct after every write. APB-1, TPC-DS and LDBC use the same rule. ClickBench does not allow stored results.

OS caches, buffer pools, compiled plans and prepared statements are also allowed.

A cache of answers keyed on a read's text or parameters is not allowed. Neither is anything built for one test's read. The runner also makes unpublished reads to catch this.

Fair comparison

Correctness

The proving read is checked during the run. Full answers are compared after the timer stops, member by member.

Amounts must match within 0.01 or a relative 1e-9, whichever is larger. Ratios must match within a relative 1e-6.