diff --git a/opteryx-parquet-rewritten/README.md b/opteryx-parquet-rewritten/README.md new file mode 100644 index 0000000000..d654eb21b9 --- /dev/null +++ b/opteryx-parquet-rewritten/README.md @@ -0,0 +1,129 @@ +# Opteryx + +Opteryx is an in-process SQL query engine. Query **planning** (parse, bind, +optimize) runs in Python; query **execution** is native (Cython/C++). It +queries Parquet directly from storage with no preloading or preprocessing, +which makes it well suited to ad hoc analytics. + +For more information, visit: + +- [Opteryx Documentation](https://docs.opteryx.app/) +- [Opteryx GitHub Repository](https://github.com/mabel-dev/opteryx-core) + +This page benchmarks Opteryx (PyPI package `opteryx-core`) on data written by +its own Parquet writer. The load step rewrites ClickBench's split Parquet files +with Opteryx's writer (rugo), using the writer's default settings; queries then +run against the rewritten files. The data stays Parquet (converted on load, the +conversion counted as load time). Its counterpart is +`Opteryx (Parquet, partitioned)`, which reads the provided files as shipped. + +### Load step + +`load` runs `convert.py`, which reads each `hits_N.parquet` and writes it back +with `rugo.parquet.write_parquet` (one output file per input file, row counts +checked against the source). The codec, rows per row group and row groups per +block are set at the top of `load`. Only the files the writer produces are kept, +so `data-size` measures the rewritten dataset. Nothing is precomputed: the +rewrite changes layout and encoding, not content. + +### Process model + +Opteryx is an in-process engine, and this entry runs it the way it is deployed: +as a long-lived service. `start` launches `server.py`, a standard-library HTTP +wrapper that imports `opteryx` and waits; `query` posts each statement to it. +This is the same shape as the pandas/polars entries. + +- `BENCH_RESTARTABLE=yes`: the driver stops the server, drops the OS page cache + and starts a fresh process before every query, so try 1 is cold. Tries 2-3 + run in the same process. +- `BENCH_DURABLE=yes`: the data is Parquet on disk and nothing is loaded into + process memory. +- `start` launches the service and nothing else: no warm-up query, and the + dataset is not touched. `check` reads `/health` and runs no query. +- There is no query-result cache. What carries from try 1 to tries 2-3 is + process state: imported modules and the engine's Parquet footer and schema + caches. +- The reported time is the server-side drain of `execute_to_morsels`, the same + span the previous process-per-query entry measured. Rendering the result as + TSV happens after the clock stops. + +--- + +## Generating Benchmark Results + +### High-level Steps +1. Set up the environment. +2. Install Python and the required dependencies. +3. Download the benchmark dataset. +4. Rewrite it with Opteryx's writer (this is the load step). +5. Run the benchmark script. + +### Detailed Instructions + +1. **Start an AWS EC2 instance** + - OS: Ubuntu 24 + - Architecture: 64-bit (x86_64 or AArch64) + - Instance Type: `c6a.4xlarge` + - Root Storage: 500 GB gp2 SSD + - Advanced Details: ensure 'EBS-optimized instance' is **disabled**. + +2. **SSH into the instance** (after status checks complete): + ~~~bash + ssh ubuntu@{ip} + ~~~ + +3. **Update the package list and install Git** + ~~~bash + sudo apt-get update -y + sudo apt-get install git -y + ~~~ + +4. **Clone the ClickBench repository** + ~~~bash + git clone https://github.com/ClickHouse/ClickBench + cd ClickBench/opteryx-parquet-rewritten + ~~~ + +5. **Run the benchmark script** + ~~~bash + sudo ./benchmark.sh + ~~~ + +### Python version + +`opteryx-core` publishes cp314 x86_64 and AArch64 manylinux wheels and declares +no runtime dependencies, so `install` is a single binary-wheel download with no +on-box compilation and no toolchain. + +`install` pins the release (`opteryx-core==0.9.164`, the latest release when +this entry was drafted) and fails if the imported +version differs, so a published result names the build that produced it. + +### Query dialect + +`queries.sql` adapts queries to Opteryx's dialect. The adaptations are syntactic +— they do not change what is computed, the rows returned, or the work the engine has to do: + +- **Q19, Q43** — `EventTime` is stored as an integer epoch, so it is cast + explicitly (`EventTime::TIMESTAMP[s]`) before `extract(minute FROM ...)` and + before truncation. +- **Q43** — `TRUNC(, 'minute')` rather than `DATE_TRUNC('minute', )`. +- **Q29** — the `REGEXP_REPLACE` pattern and replacement use `b''` and `r''` + literals so the backslash reference survives to the regex engine. +- **Q37-Q42** — `EventDate` comparisons cast both sides to `DATE` + (`EventDate::DATE >= '2013-07-01'::DATE`). + +### Hardware coverage + +The results submitted with this entry are from `c6a.4xlarge`, the canonical +machine. Results for the other instance types in the ClickBench fleet come from +the ClickBench benchmark runs, not from submitted measurements. + +### Known Issues + +- On the memory-constrained instances the heaviest `GROUP BY` queries do not fit + in RAM and spill to swap rather than failing. They complete, but two orders of + magnitude slower — on `c6a.xlarge` (8 GB) three queries account for more than + half the total runtime. The benchmark environment provides the 16 GB swapfile + that ClickBench's `cloud-init` configures for every system; without it these + queries would be `null` instead of slow. diff --git a/opteryx-parquet-rewritten/benchmark.sh b/opteryx-parquet-rewritten/benchmark.sh new file mode 100755 index 0000000000..ad5d0266f0 --- /dev/null +++ b/opteryx-parquet-rewritten/benchmark.sh @@ -0,0 +1,12 @@ +#!/bin/bash +export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-partitioned" +# Long-lived query server (server.py). Restartable: the driver stops it, drops +# caches and starts it again before every query, so try 1 is a cold process; +# tries 2-3 hit the same process. Durable: the data is Parquet on disk, nothing +# lives in process memory, so ./load is not re-run. +export BENCH_RESTARTABLE=yes +export BENCH_DURABLE=yes +# Concurrent-QPS test stays off for now: server.py serves one request at a +# time, so N connections would measure a queue, not throughput. +export BENCH_CONCURRENT_DURATION="${BENCH_CONCURRENT_DURATION:-0}" +exec ../lib/benchmark-common.sh diff --git a/opteryx-parquet-rewritten/check b/opteryx-parquet-rewritten/check new file mode 100755 index 0000000000..ba13ba5d7f --- /dev/null +++ b/opteryx-parquet-rewritten/check @@ -0,0 +1,12 @@ +#!/bin/bash +# Succeeds only while the server is up and serving a real opteryx-core install. +# Must FAIL when the server is down: with BENCH_RESTARTABLE=yes the driver waits +# for that before dropping caches for each cold try. +# +# Runs no query — the driver calls this before every cold try, and executing +# anything here would warm the engine ahead of the measurement. The version +# shape is asserted instead of a literal so this needs no edit per release. +set -e + +version=$(curl -sf http://127.0.0.1:8421/health) +[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]] diff --git a/opteryx-parquet-rewritten/convert.py b/opteryx-parquet-rewritten/convert.py new file mode 100755 index 0000000000..e6416b1370 --- /dev/null +++ b/opteryx-parquet-rewritten/convert.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +""" +Rewrite ClickBench's partitioned parquet `hits` with Opteryx's own parquet +writer (rugo), at the layout the engine reads fastest. This is the load step of +the opteryx-parquet-rewritten entry; its wall-clock is what `Load time` reports. + +Self-contained on purpose: rugo and draken ship inside the `opteryx-core` wheel, +so this needs nothing but the benchmark's own install. (The engine repo's +dev/rewrite_parquet_layout.py is dev-only tooling; this is a port of its +per-file mode. Keep them in step.) + +One output file per source file, same name. Each file is read whole, written +with rugo.parquet.write_parquet(compression, max_rows_per_row_group, +row_groups_per_block) and the writer's other defaults, and its row count is +checked against the source footer — a mismatch is a hard failure. + +Usage: convert.py [-j N] + codec: zstd|none (what rugo writes) + +PARALLELISM: processes, not threads (morsel construction holds the GIL), three +quarters of the cores: a worker holds a whole decoded file. +""" + +import os +import sys +from concurrent.futures import ProcessPoolExecutor + + +def rewrite(task): + src, dst, codec, rows, block = task + from draken.morsels.morsel import Morsel + from rugo.parquet import read_metadata + from rugo.parquet import read_parquet + from rugo.parquet import write_parquet + + expected = read_metadata(src).num_rows + with read_parquet(src) as reader: + morsels = list(reader) + morsel = Morsel.combine(morsels) if len(morsels) > 1 else morsels[0] + data = write_parquet( + morsel, compression=codec, max_rows_per_row_group=rows, row_groups_per_block=block + ) + with open(dst + ".tmp", "wb") as f: + f.write(data) + os.replace(dst + ".tmp", dst) + written = read_metadata(dst).num_rows + if written != expected or morsel.num_rows != expected: + raise RuntimeError(f"{dst}: wrote {written:,} rows, source holds {expected:,}") + return written, len(data) + + +def main(): + argv = sys.argv[1:] + workers = max(1, (os.cpu_count() or 1) * 3 // 4) + if "-j" in argv: + i = argv.index("-j") + workers = int(argv[i + 1]) + del argv[i : i + 2] + if len(argv) != 5: + print(__doc__) + return 1 + src, dst, codec, rows, block = argv[0], argv[1], argv[2], int(argv[3]), int(argv[4]) + if codec not in ("zstd", "none"): + print(f"ERROR: rugo writes zstd or none, not {codec!r}") + return 1 + names = sorted(f for f in os.listdir(src) if f.endswith(".parquet")) + if not names: + print(f"ERROR: no parquet files in {src}") + return 1 + os.makedirs(dst, exist_ok=True) + if any(f.endswith(".parquet") for f in os.listdir(dst)): + print(f"ERROR: {dst} already holds parquet files; rm -rf it first") + return 1 + tasks = [(os.path.join(src, n), os.path.join(dst, n), codec, rows, block) for n in names] + with ProcessPoolExecutor(max_workers=workers) as pool: + results = list(pool.map(rewrite, tasks)) + print( + f"codec={codec} rows_per_row_group={rows} row_groups_per_block={block} " + f"workers={workers} files={len(results)} rows={sum(r[0] for r in results)} " + f"bytes={sum(r[1] for r in results)}" + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/opteryx-skene/data-size b/opteryx-parquet-rewritten/data-size similarity index 100% rename from opteryx-skene/data-size rename to opteryx-parquet-rewritten/data-size diff --git a/opteryx-skene/install b/opteryx-parquet-rewritten/install similarity index 98% rename from opteryx-skene/install rename to opteryx-parquet-rewritten/install index 10ce317c7e..ac284b63f9 100755 --- a/opteryx-skene/install +++ b/opteryx-parquet-rewritten/install @@ -30,7 +30,7 @@ fi "$HOME/opteryx_venv/bin/python" -m pip install --upgrade pip # Pinned so a published result is reproducible against a named release. -OPTERYX_VERSION=0.9.155 +OPTERYX_VERSION=0.9.164 "$HOME/opteryx_venv/bin/python" -m pip install "opteryx-core==${OPTERYX_VERSION}" # Fail loudly here rather than 43 queries later if pip silently fell back to a diff --git a/opteryx-parquet-rewritten/load b/opteryx-parquet-rewritten/load new file mode 100755 index 0000000000..244c433755 --- /dev/null +++ b/opteryx-parquet-rewritten/load @@ -0,0 +1,23 @@ +#!/bin/bash +# ClickBench ships parquet written by another writer; this entry rewrites it with +# Opteryx's own (rugo) at the layout the engine reads fastest. That rewrite IS +# the load step, and its wall-clock is what `Load time` reports. +# +# Layout: zstd (on a 500 GB gp2 volume cold runs are IO-bound, and zstd reads the +# fewest bytes; hot runs are served by the engine's decompressed chunk cache), +# 64k-row row groups, column-major blocks of 4 — rugo's writer defaults. +set -e + +CODEC=zstd +ROWS_PER_ROW_GROUP=65536 +ROW_GROUPS_PER_BLOCK=4 + +mkdir -p parquet_src +mv hits_*.parquet parquet_src/ 2>/dev/null || true + +"$HOME/opteryx_venv/bin/python" convert.py parquet_src hits "$CODEC" "$ROWS_PER_ROW_GROUP" "$ROW_GROUPS_PER_BLOCK" + +# Drop the source once converted: `data-size` must measure the rewritten +# dataset only. +rm -rf parquet_src +sync diff --git a/opteryx-skene/queries.sql b/opteryx-parquet-rewritten/queries.sql similarity index 100% rename from opteryx-skene/queries.sql rename to opteryx-parquet-rewritten/queries.sql diff --git a/opteryx-parquet-rewritten/query b/opteryx-parquet-rewritten/query new file mode 100755 index 0000000000..9fde2b8ae5 --- /dev/null +++ b/opteryx-parquet-rewritten/query @@ -0,0 +1,28 @@ +#!/bin/bash +# Reads a SQL query from stdin and runs it on the long-lived server. +# Stdout: query result as TSV (header + rows). +# Stderr: query runtime in fractional seconds on the last line (server-measured +# drain of execute_to_morsels; see server.py). +# Exit non-zero on error; the traceback is in server.log. +set -e + +body=$(mktemp) +trap 'rm -f "$body"' EXIT + +meta=$(curl -sS -o "$body" -w '%{http_code} %header{x-elapsed}' \ + -X POST --data-binary @- http://127.0.0.1:8421/query) || { + echo "query failed: no response from server (see server.log)" >&2 + exit 1 +} + +code=${meta%% *} +elapsed=${meta#* } + +if [ "$code" != "200" ] || [ -z "$elapsed" ]; then + echo "query failed: HTTP $code" >&2 + cat "$body" >&2 + exit 1 +fi + +cat "$body" +echo "$elapsed" >&2 diff --git a/opteryx-parquet-rewritten/results/20261012/c6a.2xlarge.json b/opteryx-parquet-rewritten/results/20261012/c6a.2xlarge.json new file mode 100644 index 0000000000..57a154dbe1 --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c6a.2xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c6a.2xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 371, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.906, 0.004, 0.003], + [1.244, 0.182, 0.173], + [1.007, 0.004, 0.003], + [1.021, 0.004, 0.003], + [2.088, 0.951, 0.934], + [1.752, 0.467, 0.466], + [1.027, 0.005, 0.003], + [1.197, 0.163, 0.163], + [2.309, 1.012, 1.005], + [2.691, 1.352, 1.328], + [1.49, 0.22, 0.22], + [1.566, 0.252, 0.254], + [1.995, 0.649, 0.62], + [2.544, 1.063, 1.051], + [2.135, 0.728, 0.709], + [2.081, 0.815, 0.771], + [3.142, 1.589, 1.609], + [1.081, 0.02, 0.019], + [5.12, 3.094, 2.975], + [1.29, 0.015, 0.014], + [4.332, 0.616, 0.633], + [4.865, 0.743, 0.731], + [8.366, 1.627, 1.613], + [1.329, 0.147, 0.151], + [0.996, 0.057, 0.054], + [1.468, 0.306, 0.308], + [1.139, 0.058, 0.06], + [4.384, 0.641, 0.641], + [5.738, 3.624, 3.615], + [1.089, 0.042, 0.044], + [2.453, 0.848, 0.839], + [5.372, 0.945, 0.929], + [6.253, 3.831, 3.763], + [4.95, 2.451, 2.427], + [5.237, 2.664, 2.526], + [2.078, 0.809, 0.819], + [1.188, 0.061, 0.064], + [1.103, 0.028, 0.028], + [1.164, 0.052, 0.048], + [1.208, 0.168, 0.152], + [1.132, 0.03, 0.03], + [1.073, 0.029, 0.028], + [1.075, 0.029, 0.027] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/c6a.4xlarge.json b/opteryx-parquet-rewritten/results/20261012/c6a.4xlarge.json new file mode 100644 index 0000000000..77fa517b32 --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c6a.4xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c6a.4xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 325, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.93, 0.004, 0.003], + [1.066, 0.089, 0.089], + [0.923, 0.004, 0.003], + [0.915, 0.004, 0.003], + [1.529, 0.562, 0.535], + [1.347, 0.303, 0.306], + [0.921, 0.004, 0.003], + [1.049, 0.088, 0.088], + [1.792, 0.766, 0.724], + [2.04, 0.908, 0.906], + [1.191, 0.13, 0.13], + [0.973, 0.146, 0.146], + [1.365, 0.471, 0.474], + [2.056, 0.715, 0.727], + [1.631, 0.536, 0.526], + [1.647, 0.592, 0.583], + [2.353, 1.175, 1.188], + [0.972, 0.02, 0.019], + [3.779, 2.341, 2.306], + [1.182, 0.014, 0.013], + [4.258, 0.64, 0.627], + [4.666, 0.733, 0.715], + [8.205, 1.277, 1.319], + [0.969, 0.139, 0.14], + [1.004, 0.044, 0.045], + [1.259, 0.208, 0.209], + [1.014, 0.043, 0.043], + [4.282, 0.584, 0.589], + [4.733, 2.6, 2.579], + [0.714, 0.041, 0.042], + [2.337, 0.573, 0.553], + [5.184, 0.72, 0.749], + [5.883, 3.306, 3.372], + [4.447, 2.142, 2.157], + [4.292, 2.182, 2.142], + [1.539, 0.545, 0.58], + [0.779, 0.053, 0.05], + [0.754, 0.027, 0.025], + [1.013, 0.042, 0.041], + [1.124, 0.139, 0.127], + [1.005, 0.028, 0.028], + [1.008, 0.027, 0.027], + [1.003, 0.026, 0.026] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/c6a.large.json b/opteryx-parquet-rewritten/results/20261012/c6a.large.json new file mode 100644 index 0000000000..65abb0cb99 --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c6a.large.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c6a.large", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 955, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.94, 0.004, 0.003], + [1.619, 0.639, 0.636], + [0.945, 0.005, 0.004], + [0.941, 0.004, 0.003], + [4.448, 3.309, 3.307], + [3.433, 2.266, 2.305], + [0.937, 0.004, 0.003], + [1.632, 0.638, 0.639], + [4.65, 3.064, 3.034], + [6.429, 4.493, 4.477], + [2.075, 0.836, 0.832], + [2.241, 0.974, 0.961], + [4.148, 2.654, 2.616], + [6.041, 4.167, 4.138], + [4.646, 3.008, 2.973], + [4.424, 2.755, 2.801], + [8.299, 12.713, 16.882], + [1.024, 0.03, 0.031], + [160.93, 718.728, 817.295], + [1.163, 0.015, 0.013], + [5.818, 4.386, 4.303], + [6.577, 4.983, 4.96], + [9.638, 7.528, 7.538], + [1.631, 0.513, 0.515], + [1.208, 0.218, 0.22], + [2.702, 1.626, 1.647], + [1.217, 0.22, 0.229], + [6.467, 4.92, 4.901], + [16.428, 18.206, 19.787], + [0.983, 0.043, 0.044], + [5.347, 3.701, 3.693], + [6.299, 3.919, 3.578], + [427.486, 1081.667, 2061.819], + [116.562, 888.824, 1171.168], + [116.501, 581.345, 573.103], + [4.251, 2.759, 2.814], + [1.25, 0.191, 0.186], + [1.087, 0.063, 0.062], + [1.174, 0.117, 0.118], + [1.514, 0.414, 0.412], + [1.093, 0.058, 0.058], + [1.073, 0.057, 0.056], + [1.079, 0.064, 0.064] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/c6a.metal.json b/opteryx-parquet-rewritten/results/20261012/c6a.metal.json new file mode 100644 index 0000000000..e862403d81 --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c6a.metal.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c6a.metal", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 55, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.907, 0.008, 0.007], + [1.068, 0.156, 0.135], + [0.909, 0.008, 0.006], + [0.908, 0.007, 0.006], + [1.197, 0.197, 0.204], + [1.006, 0.195, 0.217], + [0.715, 0.008, 0.006], + [0.904, 0.158, 0.162], + [1.721, 0.607, 0.592], + [2.174, 0.644, 0.631], + [1.189, 0.242, 0.252], + [1.412, 0.28, 0.289], + [1.207, 0.395, 0.374], + [1.924, 0.422, 0.409], + [1.307, 0.416, 0.391], + [1.524, 0.442, 0.407], + [1.965, 0.629, 0.626], + [0.766, 0.023, 0.023], + [3.311, 0.893, 0.869], + [0.934, 0.021, 0.016], + [4.22, 0.342, 0.352], + [4.921, 0.334, 0.341], + [8.516, 0.68, 0.586], + [1.187, 0.328, 0.309], + [0.902, 0.17, 0.16], + [1.018, 0.227, 0.221], + [0.94, 0.182, 0.168], + [4.259, 0.317, 0.297], + [4.784, 1.162, 1.271], + [0.744, 0.044, 0.045], + [2.574, 0.349, 0.336], + [5.19, 0.437, 0.43], + [4.998, 1.317, 1.388], + [4.368, 0.802, 0.802], + [4.406, 0.831, 0.806], + [1.464, 0.444, 0.433], + [0.83, 0.076, 0.072], + [0.99, 0.037, 0.035], + [1.005, 0.05, 0.047], + [1.138, 0.176, 0.153], + [1.001, 0.038, 0.041], + [0.996, 0.038, 0.039], + [1.006, 0.031, 0.034] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/c6a.xlarge.json b/opteryx-parquet-rewritten/results/20261012/c6a.xlarge.json new file mode 100644 index 0000000000..be7d98e46a --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c6a.xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c6a.xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 647, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [1.019, 0.004, 0.003], + [1.379, 0.313, 0.314], + [0.997, 0.004, 0.003], + [0.99, 0.004, 0.003], + [2.854, 1.832, 1.834], + [2.21, 1.082, 1.085], + [1.006, 0.004, 0.003], + [1.375, 0.314, 0.313], + [2.944, 1.585, 1.61], + [3.678, 2.295, 2.242], + [1.773, 0.419, 0.42], + [1.9, 0.48, 0.479], + [2.601, 1.298, 1.303], + [3.631, 2.078, 2.06], + [2.818, 1.462, 1.476], + [2.844, 1.431, 1.441], + [4.627, 2.956, 2.868], + [1.048, 0.023, 0.022], + [8.189, 25.68, 95.726], + [0.93, 0.015, 0.013], + [4.276, 2.003, 2.004], + [4.974, 2.349, 2.309], + [8.449, 3.66, 3.676], + [1.47, 0.292, 0.284], + [1.148, 0.111, 0.121], + [1.963, 0.77, 0.785], + [1.167, 0.111, 0.118], + [4.337, 2.362, 2.356], + [9.147, 7.364, 7.259], + [1.041, 0.042, 0.044], + [3.414, 1.742, 1.812], + [5.573, 1.83, 1.848], + [95.394, 328.754, 440.47], + [8.178, 57.999, 238.942], + [7.577, 103.565, 200.689], + [2.492, 1.458, 1.397], + [1.184, 0.106, 0.103], + [1.067, 0.04, 0.038], + [1.13, 0.07, 0.067], + [1.363, 0.218, 0.218], + [1.146, 0.038, 0.041], + [1.098, 0.038, 0.037], + [1.069, 0.038, 0.038] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/c7a.metal-48xl.json b/opteryx-parquet-rewritten/results/20261012/c7a.metal-48xl.json new file mode 100644 index 0000000000..1e1a2c2b74 --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c7a.metal-48xl.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c7a.metal-48xl", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 50, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.84, 0.007, 0.007], + [1.014, 0.148, 0.113], + [0.845, 0.008, 0.006], + [0.832, 0.007, 0.007], + [1.201, 0.162, 0.181], + [1.08, 0.152, 0.158], + [0.816, 0.008, 0.006], + [1.009, 0.145, 0.147], + [1.642, 0.507, 0.496], + [2.263, 0.505, 0.535], + [1.295, 0.215, 0.18], + [1.499, 0.24, 0.22], + [1.242, 0.281, 0.281], + [2.035, 0.29, 0.29], + [1.294, 0.29, 0.302], + [1.469, 0.332, 0.323], + [2.04, 0.407, 0.387], + [0.884, 0.02, 0.019], + [3.343, 0.653, 0.655], + [1.068, 0.02, 0.019], + [4.308, 0.181, 0.182], + [5.031, 0.208, 0.202], + [8.649, 0.391, 0.316], + [1.318, 0.322, 0.297], + [1.015, 0.149, 0.141], + [1.082, 0.169, 0.16], + [1.042, 0.142, 0.149], + [4.334, 0.212, 0.218], + [4.887, 0.621, 0.643], + [0.858, 0.036, 0.035], + [2.708, 0.276, 0.274], + [5.233, 0.331, 0.31], + [5.019, 1.162, 1.1], + [4.464, 0.469, 0.448], + [4.509, 0.464, 0.454], + [1.462, 0.375, 0.37], + [0.945, 0.068, 0.061], + [0.893, 0.036, 0.032], + [0.922, 0.039, 0.04], + [1.038, 0.149, 0.151], + [0.917, 0.038, 0.038], + [0.945, 0.036, 0.037], + [0.995, 0.026, 0.031] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/c8g.4xlarge.json b/opteryx-parquet-rewritten/results/20261012/c8g.4xlarge.json new file mode 100644 index 0000000000..589c3e5523 --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c8g.4xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c8g.4xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 283, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.812, 0.004, 0.003], + [0.883, 0.049, 0.049], + [0.807, 0.004, 0.003], + [0.808, 0.004, 0.003], + [1.218, 0.26, 0.257], + [0.797, 0.138, 0.136], + [0.804, 0.004, 0.003], + [0.89, 0.049, 0.047], + [1.395, 0.458, 0.463], + [1.591, 0.549, 0.532], + [1.174, 0.082, 0.082], + [0.773, 0.097, 0.096], + [0.902, 0.209, 0.206], + [1.829, 0.329, 0.315], + [1.193, 0.246, 0.245], + [1.138, 0.248, 0.25], + [1.83, 0.468, 0.463], + [0.848, 0.015, 0.015], + [3.02, 0.84, 0.828], + [1.05, 0.014, 0.013], + [4.122, 0.195, 0.193], + [4.544, 0.277, 0.267], + [8.171, 0.486, 0.48], + [0.923, 0.084, 0.082], + [0.86, 0.025, 0.029], + [1.008, 0.097, 0.094], + [0.864, 0.03, 0.026], + [4.15, 0.212, 0.214], + [4.451, 1.12, 1.116], + [0.844, 0.033, 0.035], + [2.168, 0.274, 0.272], + [4.82, 0.294, 0.289], + [4.433, 0.985, 0.989], + [4.163, 0.612, 0.616], + [4.16, 0.605, 0.624], + [0.88, 0.257, 0.257], + [0.877, 0.028, 0.028], + [0.853, 0.02, 0.02], + [0.869, 0.027, 0.025], + [0.926, 0.069, 0.068], + [0.865, 0.021, 0.021], + [0.865, 0.019, 0.02], + [0.857, 0.019, 0.018] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/c8g.metal-48xl.json b/opteryx-parquet-rewritten/results/20261012/c8g.metal-48xl.json new file mode 100644 index 0000000000..e5ea652b40 --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/c8g.metal-48xl.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "c8g.metal-48xl", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 55, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.773, 0.004, 0.003], + [0.874, 0.064, 0.092], + [0.867, 0.004, 0.003], + [0.847, 0.004, 0.003], + [1.107, 0.16, 0.136], + [0.991, 0.112, 0.125], + [0.792, 0.004, 0.003], + [0.939, 0.097, 0.101], + [1.491, 0.364, 0.373], + [2.113, 0.382, 0.39], + [1.148, 0.102, 0.098], + [1.288, 0.131, 0.168], + [1.064, 0.201, 0.196], + [1.945, 0.221, 0.246], + [1.153, 0.211, 0.216], + [1.195, 0.23, 0.243], + [1.996, 0.3, 0.342], + [0.874, 0.014, 0.014], + [3.258, 0.473, 0.478], + [1.068, 0.013, 0.012], + [4.215, 0.149, 0.141], + [4.944, 0.145, 0.142], + [8.526, 0.215, 0.232], + [1.128, 0.16, 0.152], + [0.946, 0.08, 0.063], + [0.926, 0.077, 0.076], + [0.977, 0.07, 0.057], + [4.284, 0.128, 0.123], + [4.507, 0.473, 0.474], + [0.82, 0.033, 0.034], + [2.634, 0.197, 0.225], + [5.223, 0.235, 0.232], + [4.884, 0.988, 0.953], + [4.324, 0.352, 0.374], + [4.296, 0.353, 0.328], + [1.079, 0.215, 0.206], + [0.856, 0.036, 0.036], + [0.875, 0.021, 0.021], + [0.838, 0.026, 0.026], + [0.91, 0.078, 0.077], + [0.854, 0.022, 0.022], + [0.83, 0.02, 0.02], + [0.81, 0.02, 0.02] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/results/20261012/t3a.small.json b/opteryx-parquet-rewritten/results/20261012/t3a.small.json new file mode 100644 index 0000000000..21a4143bdd --- /dev/null +++ b/opteryx-parquet-rewritten/results/20261012/t3a.small.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, rewritten)", + "date": "2026-10-12", + "machine": "t3a.small", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 9793, + "data_size": 9496523669, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [1.377, 0.011, 0.009], + [2.475, 1.019, 1.001], + [1.446, 0.009, 0.01], + [1.486, 0.011, 0.008], + [7.76, 6.018, 6.1], + [6.272, 4.416, 4.332], + [1.284, 0.01, 0.007], + [2.327, 0.998, 1.001], + [7.794, 5.75, 6.131], + [10.348, 8.621, 10.072], + [3.115, 1.494, 1.486], + [3.489, 2.006, 1.739], + [7.77, 7.049, 10.568], + [20.115, 61.932, 100.379], + [9.189, 9.102, 18.229], + [9.319, 24.393, 39.248], + [77.075, 289.852, 344.264], + [1.458, 0.066, 0.071], + [348.597, 949.588, 1756.482], + [1.509, 0.036, 0.033], + [12.857, 9.9, 10.111], + [13.423, 10.95, 11.444], + [20.855, 19.954, 19.914], + [2.457, 1.003, 1.003], + [1.659, 0.369, 0.381], + [4.621, 2.772, 2.774], + [1.77, 0.409, 0.399], + [13.863, 11.304, 11.163], + [114.36, 524.47, 724.027], + [1.358, 0.124, 0.114], + [16.642, 70.338, 21.031], + [28.545, 138.303, 256.001], + [1814.327, 3929.828, 4565.081], + [306.986, 1961.263, 2153.5], + [295.068, 1907.876, 2167.439], + [7.952, 7.777, 7.71], + [1.71, 0.366, 0.371], + [1.441, 0.106, 0.11], + [1.528, 0.223, 0.223], + [2.221, 0.78, 0.769], + [1.399, 0.102, 0.118], + [1.432, 0.095, 0.1], + [1.464, 0.115, 0.112] +] + } + \ No newline at end of file diff --git a/opteryx-parquet-rewritten/server.py b/opteryx-parquet-rewritten/server.py new file mode 100644 index 0000000000..ba89e1eeb8 --- /dev/null +++ b/opteryx-parquet-rewritten/server.py @@ -0,0 +1,82 @@ +""" +Long-lived Opteryx query server for the ClickBench entry. + +Standard library only — the venv holds opteryx-core and nothing else. + +Routes (127.0.0.1:8421): + GET /health -> 200, body = opteryx version. No query is run: ./check + calls this before every cold try, and a query here would + warm the engine ahead of the measurement. + POST /query -> body = one SQL statement. Response body = the result as + TSV (header + rows); header X-Elapsed = seconds spent + draining execute_to_morsels. + +The clock covers exactly what the embedded entry's clock covered: draining +`execute_to_morsels`. Session construction (warm: ~0.04ms) and TSV rendering +are outside it. + +One session per request; the engine's footer and schema caches are process +scoped, so tries 2..3 of a query see a warm process. There is no result cache. + +A query that raises is not caught: the handler dies, the connection closes with +no response, `./query` exits non-zero and the driver records null. The traceback +is in server.log. +""" + +import timeit +from http.server import BaseHTTPRequestHandler +from http.server import HTTPServer + +import opteryx + +HOST = "127.0.0.1" +PORT = 8421 + + +def render_tsv(morsels) -> bytes: + lines = [] + for morsel in morsels: + if not lines: + lines.append("\t".join(c.decode() for c in morsel.column_names)) + for i in range(morsel.num_rows): + lines.append("\t".join("" if v is None else str(v) for v in morsel[i])) + return ("\n".join(lines) + "\n").encode() if lines else b"" + + +class Handler(BaseHTTPRequestHandler): + def do_GET(self): + if self.path != "/health": + self.send_error(404) + return + body = opteryx.__version__.encode() + self.send_response(200) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def do_POST(self): + if self.path != "/query": + self.send_error(404) + return + query = self.rfile.read(int(self.headers["Content-Length"])).decode() + + session = opteryx.session() + start = timeit.default_timer() + morsels = list(session.execute_to_morsels(query)) + elapsed = timeit.default_timer() - start + + body = render_tsv(morsels) + session.close() + + self.send_response(200) + self.send_header("X-Elapsed", f"{elapsed:.6f}") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def log_message(self, format, *args): + pass + + +if __name__ == "__main__": + HTTPServer((HOST, PORT), Handler).serve_forever() diff --git a/opteryx-parquet-rewritten/start b/opteryx-parquet-rewritten/start new file mode 100755 index 0000000000..277fdafc80 --- /dev/null +++ b/opteryx-parquet-rewritten/start @@ -0,0 +1,11 @@ +#!/bin/bash +# Launch the long-lived query server and nothing else: no warm-up query, no +# touching the dataset. ./check is the readiness signal. +set -e + +if [ -f server.pid ] && kill -0 "$(cat server.pid)" 2>/dev/null; then + exit 0 +fi + +nohup "$HOME/opteryx_venv/bin/python" server.py >>server.log 2>&1 & +echo $! > server.pid diff --git a/opteryx-parquet-rewritten/stop b/opteryx-parquet-rewritten/stop new file mode 100755 index 0000000000..1de5ad6a88 --- /dev/null +++ b/opteryx-parquet-rewritten/stop @@ -0,0 +1,12 @@ +#!/bin/bash +# The driver waits for ./check to fail after this, so the process must be gone, +# not just signalled. +if [ -f server.pid ]; then + pid=$(cat server.pid) + kill "$pid" 2>/dev/null || true + while kill -0 "$pid" 2>/dev/null; do + sleep 0.1 + done + rm -f server.pid +fi +exit 0 diff --git a/opteryx-skene/template.json b/opteryx-parquet-rewritten/template.json similarity index 76% rename from opteryx-skene/template.json rename to opteryx-parquet-rewritten/template.json index 36032e7542..0b331c14fb 100644 --- a/opteryx-skene/template.json +++ b/opteryx-parquet-rewritten/template.json @@ -1,5 +1,5 @@ { - "system": "Opteryx", + "system": "Opteryx (Parquet, rewritten)", "proprietary": "no", "hardware": "cpu", "tuned": "no", diff --git a/opteryx-skene/README.md b/opteryx-skene/README.md deleted file mode 100644 index 0bbda538e9..0000000000 --- a/opteryx-skene/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# Opteryx - -Opteryx is an in-process SQL query engine. Query **planning** (parse, bind, -optimize) runs in Python; query **execution** is native (Cython/C++). It -queries Parquet directly from storage with no preloading or preprocessing, -which makes it well suited to ad hoc analytics. - -For more information, visit: - -- [Opteryx Documentation](https://docs.opteryx.app/) -- [Opteryx GitHub Repository](https://github.com/mabel-dev/opteryx-core) - -This entry benchmarks Opteryx on **skene**, its native columnar storage -format. It is the native-format counterpart to `Opteryx (Parquet, partitioned)`. - ---- - -## Generating Benchmark Results - -### High-level Steps -1. Set up the environment. -2. Install Python and the required dependencies. -3. Download the benchmark dataset. -4. Convert it to skene (this is the load step). -5. Run the benchmark script. - -### Detailed Instructions - -1. **Start an AWS EC2 instance** - - OS: Ubuntu 24 - - Architecture: 64-bit (x86_64 or AArch64) - - Instance Type: `c6a.4xlarge` - - Root Storage: 500 GB gp2 SSD - - Advanced Details: ensure 'EBS-optimized instance' is **disabled**. - -2. **SSH into the instance** (after status checks complete): - ~~~bash - ssh ubuntu@{ip} - ~~~ - -3. **Update the package list and install Git** - ~~~bash - sudo apt-get update -y - sudo apt-get install git -y - ~~~ - -4. **Clone the ClickBench repository** - ~~~bash - git clone https://github.com/ClickHouse/ClickBench - cd ClickBench/opteryx-skene - ~~~ - -5. **Run the benchmark script** - ~~~bash - sudo ./benchmark.sh - ~~~ - -### Loading - -ClickBench distributes the dataset as Parquet, so this entry converts it to -skene before querying. That conversion is the load step, and `Load time` is its -wall-clock — comparable to any entry that ingests the source data into a native -store, and unlike the Parquet entry, whose load performs no conversion at all. - -`convert.py` performs the conversion using the writer that ships inside the -`opteryx-core` wheel. skene, draken and rugo are all packaged in that single -wheel, so the conversion needs no additional dependency and no source checkout. -Row groups are packed 16 per file at 262144 rows each, matching the engine's own -mirrors: packing is per directory rather than per source file. - -The conversion runs across processes. A worker owns a contiguous range of input -files end to end and writes its own output files, because morsels hold raw -pointers and cannot cross a process boundary. Workers default to three quarters -of the cores; `-j` overrides it. - -That parallelism has a cost in layout: row groups do not -span chunk boundaries, so each worker's last row group — and last file — is -short. The published mirror was built with 12 workers and holds **28 files**, -against 24 for a single-worker build of the same data, and it measures about 7% -slower across the 43 queries for that reason. `-j 1` reproduces the -single-worker layout exactly. Row count is invariant either way: it is verified -per chunk against the source footers and again on the total, and a mismatch -fails the run rather than warning. - -The source Parquet is deleted once the conversion completes, so `data-size` -measures the skene dataset alone. - -### Compression posture - -The mirror is written with the engine's read-first ("performance") posture: -skene decodes substantially faster uncompressed or lz4-compressed than with -per-section zstd, at the cost of more bytes on disk. It is a deliberate choice -for locally attached storage, where the disk is not the bottleneck and decompression -is pure cost. Remotely read data, where bytes dominate, is written differently. - -The ClickBench Parquet corpus is published pre-compressed, so -`Opteryx (Parquet, partitioned)` reads whatever that corpus contains. In -practice the two are close in size — the skene mirror is 15.39 GB against -14.74 GB of Parquet, about 4% larger. - -### Python version - -`opteryx-core` publishes cp314 x86_64 and AArch64 manylinux wheels and declares -no runtime dependencies, so `install` is a single binary-wheel download with no -on-box compilation and no toolchain. - -### Query dialect - -`queries.sql` adapts queries to Opteryx's dialect. The adaptations are syntactic -— they do not change what is computed, the rows returned, or the work the engine has to do: - -- **Q19, Q43** — `EventTime` is stored as an integer epoch, so it is cast - explicitly (`EventTime::TIMESTAMP[s]`) before `extract(minute FROM ...)` and - before truncation. -- **Q43** — `TRUNC(, 'minute')` rather than `DATE_TRUNC('minute', )`. -- **Q29** — the `REGEXP_REPLACE` pattern and replacement use `b''` and `r''` - literals so the backslash reference survives to the regex engine. -- **Q37-Q42** — `EventDate` comparisons cast both sides to `DATE` - (`EventDate::DATE >= '2013-07-01'::DATE`). - -### Hardware coverage - -Results are published for instance types with **32 or fewer vCPUs**. The account -used for these runs is limited to 32 concurrent on-demand vCPUs, so the 192-vCPU -machines in the ClickBench fleet (`c6a.metal`, `c7a.metal-48xl`, -`c8g.metal-48xl`) could not be launched. diff --git a/opteryx-skene/benchmark.sh b/opteryx-skene/benchmark.sh deleted file mode 100755 index b7ae16ae72..0000000000 --- a/opteryx-skene/benchmark.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-partitioned" -export BENCH_RESTARTABLE=no -# Single-process engine: each query forks a fresh full-machine process with no -# shared scheduler across connections, so the concurrent-QPS test only -# oversubscribes RAM rather than measuring throughput. Skip it by default; -# override BENCH_CONCURRENT_DURATION to re-enable. See issue #946. -export BENCH_CONCURRENT_DURATION="${BENCH_CONCURRENT_DURATION:-0}" -exec ../lib/benchmark-common.sh diff --git a/opteryx-skene/check b/opteryx-skene/check deleted file mode 100755 index ed305e8015..0000000000 --- a/opteryx-skene/check +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -set -e - -# Smoke test that actually executes through the engine and propagates a -# non-zero exit on failure. The old `python -m opteryx "SELECT version()"` -# CLI path is unusable here for two reasons: -# -# 1. opteryx-core's single-run CLI calls the removed opteryx.query(), -# catches the AttributeError, and STILL exits 0 -- a false green that -# would let a broken install pass this check. -# 2. `version()` is not a function in the current engine; the version is -# exposed as the system variable `@@version`. -# -# This matters more than it looks: bench_load() in lib/benchmark-common.sh -# calls ./check unconditionally, AFTER the ~14 GB download and load. A check -# that cannot pass burns the whole setup cost before failing. -# -# Assert the shape of the value rather than a literal, so the check does not -# need editing on every release. -"$HOME/opteryx_venv/bin/python" - <<'PY' -import re - -import opteryx - -session = opteryx.session() -morsels = list(session.execute_to_morsels("SELECT @@version")) -session.close() - -assert morsels, "SELECT @@version returned no morsels" -value = list(morsels[0][0])[0] -if isinstance(value, (bytes, bytearray)): - value = value.decode() -assert re.fullmatch(r"\d+\.\d+\.\d+.*", str(value)), f"unexpected version {value!r}" -PY diff --git a/opteryx-skene/convert.py b/opteryx-skene/convert.py deleted file mode 100644 index ba6c13aea5..0000000000 --- a/opteryx-skene/convert.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env python3 -""" -Convert ClickBench's partitioned parquet `hits` into its skene mirror. - -Self-contained on purpose: skene, draken and rugo all ship inside the -`opteryx-core` wheel, so this needs nothing but the benchmark's own install. -(The engine repo's dev/parquet_to_skene.py is dev-only tooling and is not -available to a ClickBench run. This file is a port of it; keep them in step.) - -Packing: 16 row groups per file at 262144 rows per row group, matching the -engine's own mirrors. Packing is per DIRECTORY, not per file — a row group can -span two source files, so output files do not correspond to input files. - -PARALLELISM: conversion runs across PROCESSES, not threads. Both hot phases -release the GIL (rugo's decode, skene's add_row_group/write_to), but the morsel -construction between them does not, which caps a thread pool at ~2.5x against -~5x for processes. Morsels hold raw pointers and cannot cross a process -boundary, so a worker owns a CONTIGUOUS RANGE OF INPUT FILES end to end and -writes its own output files; only counts come back. - -CONSEQUENCE — the output is NOT byte-identical to a serial build. Row groups do -not span chunk boundaries, so each worker's last row group is short, where -serially only the very last one was. On this dataset that is ~16 short row -groups of ~397 rather than 1. The layout is a function of the worker count; -`-j 1` reproduces the serial layout exactly. ROW COUNT is invariant, is checked -per chunk against the source footers, and a mismatch is a hard failure. - -Usage: convert.py [codec] [-j N] codec: none|lz4|zstd -""" - -import os -import sys -from concurrent.futures import ProcessPoolExecutor - -import skene -from draken.morsels.morsel import Morsel -from rugo.parquet import read_metadata -from rugo.parquet import read_parquet - -ROWS_PER_ROW_GROUP = 262144 -ROW_GROUPS_PER_FILE = 16 - - -class Packer: - def __init__(self, out_dir, stem, codec, zstd_level, first_index=0): - self.out_dir = out_dir - self.stem = stem - self.codec = codec - self.zstd_level = zstd_level - self._writer = None - self._pending = [] - self._pending_rows = 0 - self._row_groups_in_file = 0 - self.files = 0 - self.rows = 0 - self.nbytes = 0 - # Each worker reserves a disjoint output index range, so two workers - # can never write the same filename. - self._first_index = first_index - os.makedirs(out_dir, exist_ok=True) - - def add(self, morsel): - if morsel.num_rows == 0: - return - self._pending.append(morsel) - self._pending_rows += morsel.num_rows - while self._pending_rows >= ROWS_PER_ROW_GROUP: - merged = self._merge() - self._emit(merged.slice(0, ROWS_PER_ROW_GROUP)) - remainder = merged.num_rows - ROWS_PER_ROW_GROUP - if remainder > 0: - self._pending = [merged.slice(ROWS_PER_ROW_GROUP, remainder)] - else: - self._pending = [] - self._pending_rows = remainder - - def _merge(self): - # Morsel has no `concat`; `combine` is the n-way merge. Getting this - # wrong loses rows silently, which a benchmark cannot survive. - return self._pending[0] if len(self._pending) == 1 else Morsel.combine(self._pending) - - def close(self): - # The final row group is SHORT, and so is the final file - a dataset - # does not divide evenly and padding or dropping the tail are both wrong. - if self._pending_rows > 0: - self._emit(self._merge()) - self._pending = [] - self._pending_rows = 0 - self._close_file() - - def _emit(self, row_group): - if self._writer is None: - self._writer = skene.SkeneWriter( - read_acceleration=True, codec=self.codec, zstd_level=self.zstd_level - ) - self._row_groups_in_file = 0 - self._writer.add_row_group(row_group) - self._row_groups_in_file += 1 - self.rows += row_group.num_rows - if self._row_groups_in_file >= ROW_GROUPS_PER_FILE: - self._close_file() - - def _close_file(self): - if self._writer is None: - return - index = self._first_index + self.files - path = os.path.join(self.out_dir, f"{self.stem}-{index:04d}.skene") - # write_to() completes the file in place; finish() would double peak RSS - # on a wide schema for bytes nobody keeps. - self.nbytes += self._writer.write_to(path) - self.files += 1 - self._writer = None - self._row_groups_in_file = 0 - - -def convert_dir(paths, out_dir, stem, codec, zstd_level, first_index=0): - packer = Packer(out_dir, stem, codec, zstd_level, first_index) - for p in paths: - with read_parquet(p) as reader: - for morsel in reader: - packer.add(morsel) - packer.close() - return packer.files, packer.rows, packer.nbytes - - -def _default_workers(): - """Three quarters of the cores, never all of them. - - Saturating the cores measured ~50% SLOWER than the plateau: a worker holds - a whole decoded file plus up to ROW_GROUPS_PER_FILE row groups buffered in - its writer, so the run goes memory- and scheduler-bound. - """ - return max(1, (os.cpu_count() or 1) * 3 // 4) - - -def _output_files_for(rows): - """Exactly how many .skene files a chunk of `rows` rows produces — this is - what reserves each worker's output index range, so it must be exact.""" - if rows == 0: - return 0 - row_groups = -(-rows // ROWS_PER_ROW_GROUP) - return -(-row_groups // ROW_GROUPS_PER_FILE) - - -def _plan_chunks(paths, row_counts, workers): - """Split into <= `workers` CONTIGUOUS chunks of whole files, balanced by ROW - COUNT rather than file count. Returns [(paths, rows)] in input order so - output names stay sequential.""" - total = sum(row_counts) - # Never split into more chunks than there are full output files of rows: - # each chunk starts a new output file, so over-splitting a small table - # shatters it into undersized files with undersized row groups — precisely - # what packing 16 row groups per file exists to avoid. - rows_per_file = ROWS_PER_ROW_GROUP * ROW_GROUPS_PER_FILE - n = min(workers, len(paths), max(1, total // rows_per_file)) - if n <= 1 or total == 0: - return [(list(paths), total)] - - chunks = [] - start = 0 - assigned = 0 - for _ in range(n - 1): - remaining_chunks = n - len(chunks) - 1 - target = (total - assigned) / (remaining_chunks + 1) - rows = 0 - end = start - while end < len(paths): - if len(paths) - (end + 1) < remaining_chunks: - break - rows += row_counts[end] - end += 1 - if rows >= target: - break - if end == start: - break - chunks.append((paths[start:end], rows)) - assigned += rows - start = end - if start < len(paths): - chunks.append((paths[start:], sum(row_counts[start:]))) - return chunks - - -def _convert_chunk(task): - """Process-pool entry point. Top-level and picklable-only arguments because - spawn-start platforms re-import this module in the child.""" - paths, out_dir, stem, codec, zstd_level, first_index, expected_rows = task - files, rows, nbytes = convert_dir(paths, out_dir, stem, codec, zstd_level, first_index) - if rows != expected_rows: - # Catches the failure that destroyed an earlier converter quietly: a bad - # morsel merge dropped 76% of the rows and still produced a plausible, - # fast, completely wrong dataset. - raise RuntimeError( - f"{out_dir}: chunk at index {first_index} wrote {rows:,} rows " - f"but its sources hold {expected_rows:,}" - ) - return files, rows, nbytes - - -def main(): - argv = [a for a in sys.argv[1:]] - workers = _default_workers() - out = [] - i = 0 - while i < len(argv): - if argv[i] in ("-j", "--workers"): - workers = int(argv[i + 1]); i += 2; continue - if argv[i].startswith("--workers="): - workers = int(argv[i].split("=", 1)[1]); i += 1; continue - out.append(argv[i]); i += 1 - if len(out) not in (2, 3): - print(__doc__) - return 1 - src, dst = out[0], out[1] - codec = out[2] if len(out) == 3 else "lz4" - if codec not in ("none", "lz4", "zstd"): - print(f"ERROR: unknown codec {codec!r}") - return 1 - zstd_level = 9 if codec == "zstd" else 0 - - if not os.path.isdir(src): - print(f"ERROR: source not found: {src}") - return 1 - stale = [f for f in os.listdir(dst) if f.endswith(".skene")] if os.path.isdir(dst) else [] - if stale: - print(f"ERROR: {dst} already holds {len(stale)} .skene file(s); rm -rf it first") - return 1 - - paths = sorted(os.path.join(src, f) for f in os.listdir(src) if f.endswith(".parquet")) - if not paths: - print(f"ERROR: no parquet files in {src}") - return 1 - - # Row counts come from the source footers up front, so output index ranges - # can be reserved before any worker starts and no worker has to ask another - # where its files begin. - row_counts = [read_metadata(p).num_rows for p in paths] - expected_total = sum(row_counts) - - tasks = [] - next_index = 0 - for chunk_paths, chunk_rows in _plan_chunks(paths, row_counts, workers): - tasks.append((chunk_paths, dst, "hits", codec, zstd_level, next_index, chunk_rows)) - next_index += _output_files_for(chunk_rows) - - os.makedirs(dst, exist_ok=True) - if len(tasks) == 1: - results = [_convert_chunk(tasks[0])] - else: - with ProcessPoolExecutor(max_workers=len(tasks)) as pool: - results = list(pool.map(_convert_chunk, tasks)) - - files = sum(r[0] for r in results) - rows = sum(r[1] for r in results) - nbytes = sum(r[2] for r in results) - if rows != expected_total: - raise RuntimeError(f"wrote {rows:,} rows, sources hold {expected_total:,}") - if files == 0: - raise RuntimeError("no row groups read - refusing to write an empty table") - print(f"codec={codec} workers={len(tasks)} files={files} rows={rows} bytes={nbytes}") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/opteryx-skene/load b/opteryx-skene/load deleted file mode 100755 index f714884db7..0000000000 --- a/opteryx-skene/load +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# ClickBench ships parquet; skene is Opteryx's native format, so the dataset has -# to be converted before it can be queried. That conversion IS the load step, -# and its wall-clock is what `Load time` reports -- the same shape as any entry -# that ingests the source data into a native store. -set -e - -mkdir -p parquet_src -mv hits_*.parquet parquet_src/ 2>/dev/null || true - -# lz4 is the engine's read-first ("performance") posture. See README.md: it is -# deliberately NOT the codec the published parquet corpus uses, so this entry -# and `Opteryx (Parquet, partitioned)` differ in codec as well as in format. -"$HOME/opteryx_venv/bin/python" convert.py parquet_src hits lz4 - -# Drop the source once converted: `data-size` must measure the skene dataset, -# not skene plus a parquet copy, and 500 GB does not need to hold both. -rm -rf parquet_src -sync diff --git a/opteryx-skene/query b/opteryx-skene/query deleted file mode 100755 index f2ca00e871..0000000000 --- a/opteryx-skene/query +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# Reads a SQL query from stdin, runs it via opteryx-core (Python in-process) -# against the partitioned parquet under ./hits/. -# Stdout: query result as TSV (header + rows). -# Stderr: query runtime in fractional seconds on the last line. -set -e - -query=$(cat) - -"$HOME/opteryx_venv/bin/python" - "$query" <<'PY' -import sys -import timeit - -import opteryx - -query = sys.argv[1] - -# opteryx-core execution surface: a Session that yields native -# morsels. `execute_to_morsels` runs entirely in the native engine; draining -# the generator is the execution. We time the drain (matching the engine's own -# ClickBench runner), holding the morsels so results can be emitted afterwards. -# NB: opteryx.query() / Cursor.arrow() from the 0.x line no longer exist here. -session = opteryx.session() -start = timeit.default_timer() -morsels = list(session.execute_to_morsels(query)) -end = timeit.default_timer() - -cols = None -for morsel in morsels: - if cols is None: - cols = morsel.column_names - print("\t".join( - c.decode() if isinstance(c, (bytes, bytearray)) else str(c) - for c in cols - )) - for i in range(morsel.num_rows): - print("\t".join("" if v is None else str(v) for v in morsel[i])) - -session.close() - -print(f"{end - start:.3f}", file=sys.stderr) -PY diff --git a/opteryx-skene/results/20260818/c6a.4xlarge.json b/opteryx-skene/results/20260818/c6a.4xlarge.json deleted file mode 100644 index d51a3a9427..0000000000 --- a/opteryx-skene/results/20260818/c6a.4xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-18", - "machine": "c6a.4xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 208, - "data_size": 14949726123, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.743, 0.097, 0.098], - [0.915, 0.194, 0.196], - [1.047, 0.231, 0.232], - [1.023, 0.188, 0.188], - [1.432, 0.74, 0.743], - [1.978, 0.468, 0.465], - [0.771, 0.098, 0.098], - [0.942, 0.199, 0.199], - [1.908, 0.933, 0.926], - [2.992, 1.074, 1.071], - [1.691, 0.328, 0.327], - [1.931, 0.351, 0.348], - [1.962, 0.866, 0.866], - [3.382, 1.114, 1.11], - [2.531, 0.974, 0.975], - [1.707, 0.963, 0.976], - [3.876, 2.067, 2.071], - [3.828, 2.041, 2.099], - [7.114, 4.55, 4.548], - [0.967, 0.188, 0.194], - [7.82, 1.317, 1.308], - [9.734, 1.417, 1.429], - [15.509, 2.167, 2.176], - [10.165, 1.493, 1.492], - [3.413, 0.429, 0.426], - [1.918, 0.377, 0.377], - [3.735, 0.454, 0.453], - [7.99, 1.919, 1.953], - [7.426, 3.519, 3.49], - [0.754, 0.243, 0.244], - [4.34, 0.844, 0.849], - [7.162, 1.185, 1.163], - [8.723, 6.55, 6.641], - [9.235, 4.105, 4.107], - [9.29, 4.151, 4.128], - [1.394, 0.822, 0.822], - [0.989, 0.276, 0.276], - [0.951, 0.201, 0.207], - [0.965, 0.224, 0.219], - [1.247, 0.56, 0.56], - [0.92, 0.177, 0.175], - [0.892, 0.168, 0.168], - [0.868, 0.159, 0.164] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c6a.2xlarge.json b/opteryx-skene/results/20260827/c6a.2xlarge.json deleted file mode 100644 index c1a7c2cf42..0000000000 --- a/opteryx-skene/results/20260827/c6a.2xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c6a.2xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 261, - "data_size": 11716597848, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.821, 0.203, 0.199], - [1.213, 0.444, 0.465], - [1.364, 0.45, 0.452], - [1.418, 0.368, 0.371], - [2.171, 1.371, 1.34], - [1.832, 0.812, 0.812], - [0.833, 0.2, 0.2], - [1.224, 0.433, 0.444], - [2.304, 1.311, 1.274], - [2.713, 1.571, 1.606], - [1.614, 0.522, 0.529], - [1.746, 0.668, 0.654], - [2.359, 1.326, 1.317], - [3.214, 1.646, 1.648], - [2.383, 1.523, 1.535], - [2.509, 1.553, 1.55], - [4.429, 3.126, 3.171], - [4.267, 3.118, 3.098], - [8.543, 6.889, 6.996], - [1.191, 0.302, 0.306], - [7.704, 1.594, 1.581], - [8.997, 1.754, 1.757], - [14.806, 2.51, 2.504], - [10.016, 1.874, 1.859], - [3.359, 0.712, 0.744], - [1.585, 0.654, 0.654], - [3.329, 0.742, 0.744], - [7.728, 2.194, 2.219], - [8.113, 4.972, 4.968], - [1.093, 0.41, 0.413], - [3.485, 1.342, 1.355], - [6.719, 1.762, 1.762], - [23.648, 42.405, 40.915], - [9.905, 5.772, 5.791], - [9.775, 5.865, 5.783], - [2.06, 1.337, 1.338], - [0.916, 0.331, 0.33], - [0.896, 0.246, 0.243], - [1.042, 0.286, 0.281], - [1.347, 0.589, 0.569], - [0.91, 0.241, 0.236], - [0.92, 0.232, 0.235], - [0.924, 0.236, 0.235] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c6a.4xlarge.json b/opteryx-skene/results/20260827/c6a.4xlarge.json deleted file mode 100644 index 5a0ca1f06d..0000000000 --- a/opteryx-skene/results/20260827/c6a.4xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c6a.4xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 174, - "data_size": 11712106224, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.85, 0.202, 0.201], - [1.16, 0.337, 0.337], - [1.436, 0.341, 0.341], - [1.485, 0.303, 0.305], - [1.619, 0.852, 0.84], - [1.895, 0.57, 0.572], - [0.858, 0.199, 0.197], - [1.022, 0.329, 0.329], - [1.989, 1.024, 1.032], - [2.788, 1.186, 1.193], - [1.746, 0.454, 0.443], - [1.844, 0.513, 0.496], - [2.127, 0.96, 0.969], - [3.412, 1.171, 1.178], - [2.256, 1.065, 1.06], - [1.843, 1.065, 1.068], - [3.908, 2.131, 2.13], - [3.896, 2.108, 2.099], - [7.374, 4.504, 4.473], - [1.056, 0.263, 0.263], - [8.456, 1.393, 1.407], - [10.073, 1.539, 1.532], - [16.448, 2.245, 2.246], - [11.318, 1.619, 1.617], - [3.889, 0.546, 0.548], - [1.869, 0.486, 0.491], - [3.883, 0.566, 0.562], - [8.003, 2.004, 1.996], - [7.673, 3.542, 3.531], - [1.14, 0.345, 0.345], - [3.548, 0.963, 0.955], - [6.688, 1.265, 1.287], - [8.572, 6.394, 6.329], - [9.362, 4.095, 4.116], - [9.356, 4.153, 4.123], - [1.683, 0.895, 0.912], - [1.059, 0.321, 0.319], - [0.943, 0.236, 0.235], - [1.039, 0.276, 0.276], - [1.354, 0.551, 0.566], - [0.972, 0.232, 0.232], - [0.974, 0.226, 0.226], - [0.899, 0.233, 0.232] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c6a.large.json b/opteryx-skene/results/20260827/c6a.large.json deleted file mode 100644 index d8d2678edb..0000000000 --- a/opteryx-skene/results/20260827/c6a.large.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c6a.large", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 1006, - "data_size": 11703394952, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.829, 0.197, 0.199], - [2.753, 1.266, 1.265], - [3.653, 1.276, 1.276], - [3.362, 0.904, 0.904], - [7.227, 4.699, 4.703], - [5.63, 2.842, 2.867], - [0.821, 0.197, 0.199], - [2.748, 1.261, 1.259], - [6.967, 4.285, 4.278], - [9.808, 5.556, 5.574], - [4.181, 1.247, 1.256], - [4.843, 1.94, 1.944], - [7.268, 4.393, 4.45], - [10.022, 5.877, 5.904], - [7.999, 5.097, 4.99], - [8.091, 5.647, 5.676], - [55.302, 54.812, 60.995], - [81.629, 99.164, 62.027], - [342.155, 342.672, 348.672], - [2.65, 0.603, 0.597], - [14.581, 5.54, 5.582], - [17.161, 6.358, 6.43], - [27.466, 28.096, 30.116], - [18.684, 6.854, 6.89], - [7.849, 2.341, 2.345], - [4.756, 1.935, 1.92], - [7.602, 2.452, 2.448], - [17.621, 8.214, 8.184], - [66.031, 35.634, 87.1], - [2.74, 0.896, 0.894], - [10.119, 4.729, 4.776], - [16.581, 8.043, 9.874], - [514.765, 509.823, 506.94], - [235.765, 232.782, 231.815], - [234.362, 236.86, 237.311], - [7.029, 4.788, 4.812], - [1.395, 0.563, 0.565], - [1.02, 0.309, 0.305], - [1.199, 0.378, 0.377], - [2.095, 1.057, 1.078], - [1.016, 0.274, 0.274], - [0.986, 0.268, 0.266], - [0.987, 0.281, 0.279] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c6a.metal.json b/opteryx-skene/results/20260827/c6a.metal.json deleted file mode 100644 index 55f40f8a19..0000000000 --- a/opteryx-skene/results/20260827/c6a.metal.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c6a.metal", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 106, - "data_size": 11719576384, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.687, 0.193, 0.195], - [0.909, 0.273, 0.272], - [0.871, 0.281, 0.278], - [1.541, 0.262, 0.26], - [1.795, 0.559, 0.56], - [1.84, 0.413, 0.401], - [0.663, 0.197, 0.195], - [0.808, 0.268, 0.268], - [1.926, 0.723, 0.725], - [2.809, 0.817, 0.801], - [1.689, 0.369, 0.366], - [1.789, 0.401, 0.403], - [2.063, 0.644, 0.653], - [3.322, 0.715, 0.731], - [2.029, 0.694, 0.653], - [1.285, 0.716, 0.703], - [3.017, 1.163, 1.21], - [3.043, 1.177, 1.184], - [5.688, 2.642, 2.556], - [0.97, 0.236, 0.24], - [7.541, 0.766, 0.776], - [9.034, 0.788, 0.853], - [14.799, 1.242, 1.141], - [9.972, 0.974, 1.028], - [3.308, 0.389, 0.388], - [1.496, 0.353, 0.361], - [3.319, 0.394, 0.417], - [7.802, 1.089, 1.14], - [7.621, 2.171, 2.164], - [0.857, 0.31, 0.315], - [3.268, 0.63, 0.637], - [6.36, 0.848, 0.852], - [6.604, 3.545, 3.455], - [8.527, 2.32, 2.486], - [8.607, 2.324, 2.41], - [1.175, 0.603, 0.608], - [0.819, 0.302, 0.299], - [0.698, 0.23, 0.232], - [0.781, 0.27, 0.27], - [1.226, 0.535, 0.529], - [0.873, 0.225, 0.227], - [0.856, 0.222, 0.222], - [0.865, 0.233, 0.227] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c6a.xlarge.json b/opteryx-skene/results/20260827/c6a.xlarge.json deleted file mode 100644 index 24f3f1b1f5..0000000000 --- a/opteryx-skene/results/20260827/c6a.xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c6a.xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 515, - "data_size": 11716852240, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.838, 0.214, 0.211], - [1.836, 0.741, 0.724], - [2.155, 0.756, 0.751], - [2.213, 0.576, 0.581], - [4.624, 3.033, 3.079], - [3.615, 1.757, 1.751], - [0.836, 0.215, 0.217], - [1.766, 0.695, 0.739], - [4.387, 2.534, 2.531], - [5.498, 3.236, 3.211], - [2.73, 0.839, 0.898], - [3.162, 1.231, 1.263], - [4.658, 2.792, 2.781], - [6.221, 3.581, 3.615], - [5.083, 3.346, 3.234], - [4.93, 3.465, 3.899], - [11.427, 7.439, 7.384], - [9.817, 7.121, 7.145], - [78.166, 77.978, 78.502], - [1.856, 0.424, 0.448], - [9.05, 3.089, 3.083], - [10.558, 3.456, 3.468], - [16.288, 5.309, 5.315], - [11.388, 3.783, 3.705], - [4.635, 1.387, 1.388], - [3.136, 1.248, 1.241], - [4.7, 1.456, 1.527], - [10.451, 4.252, 4.267], - [16.255, 11.523, 11.788], - [1.816, 0.598, 0.638], - [6.293, 2.901, 2.835], - [8.824, 3.693, 3.691], - [295.271, 298.16, 314.782], - [82.526, 96.451, 98.445], - [95.367, 93.42, 112.928], - [4.478, 2.957, 2.96], - [1.259, 0.501, 0.501], - [0.978, 0.305, 0.318], - [1.148, 0.369, 0.361], - [1.723, 0.832, 0.816], - [0.983, 0.286, 0.285], - [0.953, 0.27, 0.266], - [0.975, 0.271, 0.28] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c7a.metal-48xl.json b/opteryx-skene/results/20260827/c7a.metal-48xl.json deleted file mode 100644 index 2b9264ca41..0000000000 --- a/opteryx-skene/results/20260827/c7a.metal-48xl.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c7a.metal-48xl", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 100, - "data_size": 11719576384, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.858, 0.181, 0.179], - [1.17, 0.258, 0.256], - [1.12, 0.256, 0.256], - [1.399, 0.237, 0.239], - [1.522, 0.443, 0.438], - [1.998, 0.346, 0.352], - [0.835, 0.183, 0.179], - [0.996, 0.253, 0.249], - [1.958, 0.633, 0.628], - [2.7, 0.713, 0.697], - [1.752, 0.341, 0.334], - [1.914, 0.375, 0.377], - [2.054, 0.538, 0.52], - [3.294, 0.619, 0.604], - [2.255, 0.557, 0.562], - [1.602, 0.611, 0.588], - [3.616, 1.014, 1.017], - [3.464, 0.977, 0.995], - [6.337, 2.19, 2.162], - [1.047, 0.224, 0.221], - [7.708, 0.689, 0.69], - [9.196, 0.739, 0.716], - [15.003, 0.92, 0.939], - [10.143, 0.816, 0.818], - [3.524, 0.342, 0.346], - [1.695, 0.307, 0.304], - [3.487, 0.355, 0.348], - [7.924, 0.864, 0.863], - [7.648, 1.695, 1.741], - [1.084, 0.279, 0.277], - [3.426, 0.544, 0.532], - [6.468, 0.71, 0.696], - [6.669, 3.115, 3.156], - [8.664, 2.064, 2.039], - [8.644, 2.085, 2.119], - [1.341, 0.531, 0.53], - [1.02, 0.288, 0.288], - [0.908, 0.215, 0.213], - [0.998, 0.255, 0.252], - [1.256, 0.498, 0.507], - [0.902, 0.212, 0.213], - [0.897, 0.205, 0.205], - [0.921, 0.214, 0.21] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c8g.4xlarge.json b/opteryx-skene/results/20260827/c8g.4xlarge.json deleted file mode 100644 index 2aeb186b9f..0000000000 --- a/opteryx-skene/results/20260827/c8g.4xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c8g.4xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 153, - "data_size": 11712106224, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.703, 0.193, 0.193], - [0.869, 0.271, 0.266], - [0.962, 0.279, 0.277], - [1.295, 0.26, 0.258], - [1.216, 0.584, 0.593], - [1.555, 0.395, 0.402], - [0.695, 0.194, 0.194], - [0.849, 0.263, 0.264], - [1.622, 0.718, 0.704], - [2.35, 0.797, 0.797], - [1.378, 0.359, 0.363], - [1.474, 0.391, 0.385], - [1.667, 0.581, 0.584], - [2.741, 0.676, 0.671], - [1.765, 0.641, 0.644], - [1.305, 0.653, 0.662], - [3.027, 1.177, 1.191], - [2.994, 1.17, 1.172], - [5.619, 2.446, 2.417], - [0.877, 0.235, 0.238], - [7.521, 0.729, 0.722], - [9.022, 0.769, 0.764], - [14.815, 0.979, 0.992], - [9.906, 0.843, 0.839], - [3.293, 0.366, 0.363], - [1.52, 0.337, 0.336], - [3.306, 0.373, 0.374], - [7.76, 0.874, 0.872], - [7.275, 1.681, 1.657], - [0.912, 0.302, 0.303], - [3.244, 0.554, 0.556], - [6.292, 0.687, 0.692], - [6.837, 3.452, 3.439], - [8.365, 2.103, 2.061], - [8.365, 2.116, 2.086], - [1.218, 0.582, 0.59], - [0.818, 0.282, 0.279], - [0.729, 0.221, 0.224], - [0.787, 0.242, 0.243], - [0.999, 0.441, 0.446], - [0.743, 0.216, 0.215], - [0.749, 0.21, 0.213], - [0.79, 0.221, 0.219] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260827/c8g.metal-48xl.json b/opteryx-skene/results/20260827/c8g.metal-48xl.json deleted file mode 100644 index bfb1522171..0000000000 --- a/opteryx-skene/results/20260827/c8g.metal-48xl.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-27", - "machine": "c8g.metal-48xl", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 105, - "data_size": 11719576384, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.646, 0.181, 0.18], - [0.783, 0.247, 0.246], - [0.831, 0.258, 0.26], - [1.759, 0.241, 0.243], - [1.828, 0.507, 0.509], - [1.942, 0.364, 0.369], - [0.657, 0.181, 0.181], - [0.809, 0.24, 0.24], - [1.893, 0.585, 0.585], - [2.568, 0.665, 0.655], - [1.77, 0.323, 0.322], - [1.49, 0.35, 0.351], - [1.634, 0.541, 0.524], - [3.404, 0.611, 0.613], - [1.737, 0.593, 0.582], - [1.329, 0.593, 0.589], - [2.967, 1.071, 1.077], - [2.962, 1.065, 1.062], - [5.43, 2.19, 2.125], - [0.953, 0.22, 0.22], - [7.558, 0.681, 0.677], - [9.086, 0.72, 0.72], - [14.837, 0.939, 0.929], - [9.943, 0.801, 0.806], - [3.325, 0.347, 0.347], - [1.512, 0.315, 0.315], - [3.348, 0.355, 0.355], - [7.749, 0.853, 0.859], - [7.161, 1.456, 1.501], - [0.818, 0.289, 0.286], - [3.236, 0.521, 0.522], - [6.287, 0.658, 0.651], - [6.518, 3.015, 3.009], - [8.332, 1.894, 1.944], - [8.347, 1.953, 1.93], - [1.101, 0.52, 0.52], - [0.799, 0.266, 0.265], - [0.669, 0.209, 0.209], - [0.742, 0.231, 0.229], - [0.963, 0.406, 0.426], - [0.748, 0.203, 0.203], - [0.791, 0.201, 0.2], - [0.799, 0.207, 0.207] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20260828/t3a.small.json b/opteryx-skene/results/20260828/t3a.small.json deleted file mode 100644 index 62fd776421..0000000000 --- a/opteryx-skene/results/20260828/t3a.small.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-08-28", - "machine": "t3a.small", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 6452, - "data_size": 11703394952, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [1.142, 0.507, 0.492], - [4.273, 2.657, 2.726], - [4.903, 2.543, 2.552], - [4.493, 1.91, 1.894], - [11.754, 9.349, 9.518], - [8.741, 5.66, 5.769], - [1.122, 0.476, 0.462], - [4.194, 2.625, 2.618], - [11.712, 9.052, 8.65], - [15.034, 11.136, 10.799], - [5.832, 2.738, 2.831], - [7.259, 4.153, 4.071], - [20.437, 45.624, 14.956], - [62.712, 62.383, 75.821], - [28.123, 51.604, 28.574], - [17.032, 45.817, 16.24], - [210.702, 207.55, 205.656], - [194.325, 200.986, 199.963], - [561.218, 576.368, 667.713], - [4.109, 1.577, 1.587], - [22.582, 21.953, 22.357], - [24.886, 23.123, 25.613], - [39.656, 41.988, 40.14], - [25.533, 25.998, 28.229], - [10.48, 4.912, 4.841], - [7.33, 4.146, 4.397], - [10.67, 4.891, 5.171], - [26.479, 26.716, 27.119], - [145.17, 140.05, 147.532], - [3.994, 1.869, 1.863], - [15.803, 43.065, 14.004], - [72.203, 75.751, 86.396], - [705.163, 707.2, 697.98], - [342.525, 340.106, 341.372], - [459.351, 889.003, 444.038], - [16.006, 14.545, 13.26], - [2.255, 1.233, 1.368], - [1.745, 0.775, 0.839], - [1.816, 0.876, 0.845], - [3.724, 2.489, 2.504], - [2.053, 1.059, 0.757], - [1.736, 0.832, 0.786], - [1.582, 0.821, 0.78] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c6a.2xlarge.json b/opteryx-skene/results/20261004/c6a.2xlarge.json deleted file mode 100644 index b2b54b75b2..0000000000 --- a/opteryx-skene/results/20261004/c6a.2xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c6a.2xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 244, - "data_size": 11703080392, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.563, 0.085, 0.085], - [1.05, 0.253, 0.264], - [0.757, 0.087, 0.089], - [0.74, 0.088, 0.088], - [2.126, 1.134, 1.169], - [1.708, 0.697, 0.706], - [0.75, 0.085, 0.086], - [1.037, 0.263, 0.263], - [2.317, 1.307, 1.267], - [2.78, 1.585, 1.598], - [1.347, 0.343, 0.344], - [1.438, 0.403, 0.407], - [2.034, 1.003, 0.997], - [2.641, 1.397, 1.41], - [2.231, 1.136, 1.115], - [2.12, 1.174, 1.194], - [3.47, 2.222, 2.218], - [0.872, 0.126, 0.126], - [6.045, 4.329, 4.273], - [1.072, 0.188, 0.199], - [7.017, 1.821, 1.846], - [8.039, 2.108, 2.037], - [13.402, 3.07, 3.115], - [10.405, 1.886, 1.868], - [2.357, 0.683, 0.685], - [1.336, 0.543, 0.545], - [2.549, 0.702, 0.69], - [6.908, 1.13, 1.13], - [7.084, 4.859, 4.948], - [0.79, 0.124, 0.123], - [2.378, 1.017, 1.032], - [5.159, 1.283, 1.212], - [6.185, 4.843, 4.829], - [7.328, 4.163, 4.086], - [7.204, 4.101, 4.162], - [1.8, 1.137, 1.144], - [0.937, 0.213, 0.214], - [0.834, 0.126, 0.13], - [0.901, 0.184, 0.182], - [1.139, 0.38, 0.363], - [0.843, 0.122, 0.123], - [0.812, 0.116, 0.114], - [0.841, 0.122, 0.118] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c6a.4xlarge.json b/opteryx-skene/results/20261004/c6a.4xlarge.json deleted file mode 100644 index ecd10f4fcf..0000000000 --- a/opteryx-skene/results/20261004/c6a.4xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c6a.4xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 172, - "data_size": 11698473632, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.774, 0.083, 0.083], - [0.958, 0.177, 0.177], - [0.802, 0.085, 0.083], - [0.806, 0.084, 0.084], - [1.685, 0.711, 0.701], - [1.527, 0.477, 0.48], - [0.791, 0.085, 0.085], - [0.953, 0.179, 0.178], - [2.021, 0.946, 0.956], - [2.301, 1.111, 1.139], - [1.292, 0.27, 0.269], - [1.368, 0.309, 0.305], - [1.762, 0.706, 0.704], - [2.248, 0.971, 0.983], - [1.877, 0.783, 0.782], - [1.783, 0.806, 0.792], - [2.762, 1.503, 1.504], - [0.874, 0.117, 0.119], - [4.431, 2.81, 2.825], - [1.098, 0.162, 0.162], - [7.168, 1.553, 1.559], - [8.189, 1.758, 1.74], - [13.591, 2.686, 2.665], - [10.379, 1.627, 1.662], - [2.428, 0.528, 0.529], - [1.137, 0.403, 0.401], - [2.623, 0.542, 0.54], - [6.864, 1.005, 1.013], - [6.966, 3.45, 3.461], - [0.69, 0.124, 0.122], - [1.854, 0.743, 0.742], - [5.198, 1.034, 0.999], - [5.543, 3.718, 3.752], - [7.297, 2.967, 2.928], - [7.324, 2.965, 2.964], - [1.444, 0.746, 0.758], - [0.84, 0.211, 0.202], - [0.897, 0.117, 0.114], - [0.97, 0.162, 0.169], - [1.144, 0.344, 0.345], - [0.874, 0.115, 0.112], - [0.901, 0.109, 0.109], - [0.903, 0.116, 0.114] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c6a.large.json b/opteryx-skene/results/20261004/c6a.large.json deleted file mode 100644 index 7ac2c6385c..0000000000 --- a/opteryx-skene/results/20261004/c6a.large.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c6a.large", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 867, - "data_size": 11689868024, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.727, 0.086, 0.09], - [1.559, 0.818, 0.833], - [0.72, 0.088, 0.087], - [0.722, 0.086, 0.086], - [4.333, 3.441, 3.33], - [3.19, 2.022, 2.017], - [0.724, 0.088, 0.087], - [1.547, 0.815, 0.826], - [4.491, 3.439, 3.362], - [5.79, 4.536, 4.516], - [1.939, 0.878, 0.878], - [2.189, 1.091, 1.091], - [3.976, 2.814, 2.779], - [5.606, 4.092, 4.066], - [4.43, 3.251, 3.214], - [4.52, 3.547, 3.481], - [8.13, 7.373, 7.266], - [0.914, 0.155, 0.157], - [94.995, 93.263, 96.266], - [1.27, 0.369, 0.375], - [8.264, 4.859, 4.871], - [9.561, 5.294, 5.609], - [14.226, 12.415, 11.897], - [10.908, 5.15, 5.269], - [3.675, 1.816, 1.823], - [2.654, 1.468, 1.431], - [3.68, 1.877, 1.866], - [6.959, 2.758, 2.827], - [16.823, 16.317, 16.425], - [0.767, 0.126, 0.128], - [4.59, 2.97, 2.94], - [5.901, 3.096, 3.066], - [232.075, 233.01, 232.763], - [49.688, 50.008, 49.902], - [50.661, 49.162, 50.792], - [4.349, 3.457, 3.434], - [1.073, 0.359, 0.355], - [0.878, 0.182, 0.184], - [0.968, 0.244, 0.241], - [1.427, 0.678, 0.656], - [0.862, 0.156, 0.156], - [0.856, 0.151, 0.152], - [0.856, 0.159, 0.158] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c6a.metal.json b/opteryx-skene/results/20261004/c6a.metal.json deleted file mode 100644 index bdd5edf4e0..0000000000 --- a/opteryx-skene/results/20261004/c6a.metal.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c6a.metal", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 79, - "data_size": 11705606444, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.706, 0.092, 0.092], - [0.868, 0.156, 0.166], - [0.719, 0.092, 0.092], - [0.717, 0.095, 0.095], - [1.271, 0.369, 0.377], - [1.319, 0.336, 0.318], - [0.716, 0.094, 0.091], - [0.883, 0.16, 0.157], - [1.644, 0.656, 0.729], - [1.84, 0.785, 0.745], - [1.211, 0.315, 0.304], - [0.905, 0.366, 0.374], - [1.024, 0.485, 0.487], - [2.055, 0.594, 0.581], - [1.038, 0.456, 0.536], - [1.341, 0.567, 0.558], - [2.202, 0.945, 0.993], - [0.539, 0.132, 0.126], - [4.119, 1.663, 1.727], - [0.633, 0.189, 0.186], - [6.956, 1.281, 1.241], - [8.197, 1.331, 1.39], - [13.762, 1.687, 1.758], - [10.355, 1.041, 1.042], - [2.246, 0.42, 0.433], - [0.851, 0.321, 0.344], - [2.241, 0.422, 0.475], - [6.719, 0.796, 0.818], - [6.795, 1.698, 1.688], - [0.489, 0.129, 0.127], - [1.834, 0.576, 0.577], - [4.723, 0.797, 0.825], - [4.765, 2.529, 2.65], - [7.359, 1.957, 1.881], - [7.342, 1.923, 1.912], - [1.022, 0.528, 0.535], - [0.941, 0.213, 0.22], - [0.804, 0.148, 0.136], - [0.896, 0.181, 0.183], - [1.116, 0.323, 0.34], - [0.816, 0.126, 0.125], - [0.805, 0.133, 0.121], - [0.803, 0.129, 0.125] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c6a.xlarge.json b/opteryx-skene/results/20261004/c6a.xlarge.json deleted file mode 100644 index c5d12e5811..0000000000 --- a/opteryx-skene/results/20261004/c6a.xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c6a.xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 642, - "data_size": 11703343804, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.746, 0.084, 0.087], - [1.198, 0.411, 0.448], - [0.736, 0.088, 0.086], - [0.738, 0.082, 0.082], - [2.954, 1.951, 1.944], - [2.356, 1.224, 1.204], - [0.724, 0.085, 0.085], - [1.19, 0.434, 0.449], - [3.2, 2.041, 2.016], - [3.887, 2.639, 2.629], - [1.599, 0.514, 0.527], - [1.769, 0.649, 0.629], - [2.764, 1.634, 1.616], - [3.882, 2.538, 2.398], - [3.126, 1.91, 1.878], - [2.952, 1.967, 2.074], - [5.387, 3.914, 3.817], - [0.898, 0.142, 0.142], - [9.804, 8.46, 8.078], - [1.207, 0.247, 0.247], - [7.028, 2.771, 2.813], - [8.177, 3.162, 3.242], - [13.61, 4.991, 4.868], - [10.796, 3.043, 3.036], - [2.697, 1.063, 1.107], - [1.911, 0.874, 0.914], - [2.716, 1.141, 1.148], - [6.999, 1.655, 1.651], - [11.015, 8.465, 8.53], - [0.779, 0.126, 0.128], - [3.318, 1.728, 1.725], - [5.242, 1.897, 1.909], - [28.704, 25.784, 25.63], - [9.806, 9.499, 9.567], - [9.987, 9.285, 9.349], - [2.825, 1.879, 1.915], - [0.999, 0.279, 0.264], - [0.841, 0.14, 0.142], - [0.91, 0.197, 0.193], - [1.293, 0.565, 0.571], - [0.858, 0.141, 0.137], - [0.839, 0.125, 0.124], - [0.832, 0.142, 0.142] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c7a.metal-48xl.json b/opteryx-skene/results/20261004/c7a.metal-48xl.json deleted file mode 100644 index b034aa04e9..0000000000 --- a/opteryx-skene/results/20261004/c7a.metal-48xl.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c7a.metal-48xl", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 74, - "data_size": 11705606444, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.707, 0.085, 0.081], - [0.854, 0.138, 0.129], - [0.716, 0.084, 0.082], - [0.711, 0.084, 0.08], - [1.261, 0.343, 0.343], - [1.301, 0.285, 0.285], - [0.465, 0.085, 0.081], - [0.664, 0.15, 0.142], - [1.587, 0.597, 0.578], - [1.714, 0.673, 0.694], - [0.867, 0.293, 0.288], - [0.921, 0.343, 0.337], - [1.003, 0.399, 0.413], - [1.621, 0.486, 0.491], - [1.05, 0.408, 0.405], - [1.038, 0.536, 0.525], - [2.136, 0.807, 0.805], - [0.56, 0.115, 0.112], - [3.972, 1.408, 1.361], - [0.673, 0.164, 0.159], - [6.874, 1.1, 1.07], - [8.139, 1.173, 1.194], - [13.674, 1.585, 1.502], - [10.339, 0.994, 0.943], - [2.274, 0.385, 0.377], - [0.909, 0.272, 0.263], - [2.28, 0.375, 0.389], - [6.75, 0.704, 0.727], - [6.698, 1.418, 1.511], - [0.507, 0.114, 0.109], - [1.762, 0.509, 0.52], - [4.667, 0.736, 0.699], - [4.55, 2.329, 2.152], - [7.273, 1.712, 1.764], - [7.237, 1.716, 1.729], - [1.019, 0.49, 0.487], - [0.929, 0.199, 0.193], - [0.804, 0.12, 0.116], - [0.888, 0.17, 0.163], - [1.08, 0.31, 0.305], - [0.812, 0.117, 0.113], - [0.802, 0.114, 0.114], - [0.804, 0.12, 0.117] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c8g.4xlarge.json b/opteryx-skene/results/20261004/c8g.4xlarge.json deleted file mode 100644 index 6a8e3b0a3f..0000000000 --- a/opteryx-skene/results/20261004/c8g.4xlarge.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c8g.4xlarge", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 144, - "data_size": 11698473632, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.618, 0.062, 0.062], - [0.742, 0.108, 0.107], - [0.621, 0.061, 0.061], - [0.617, 0.061, 0.061], - [1.173, 0.361, 0.347], - [1.264, 0.252, 0.257], - [0.533, 0.062, 0.062], - [0.626, 0.109, 0.108], - [1.233, 0.507, 0.506], - [1.564, 0.583, 0.586], - [1.022, 0.158, 0.161], - [1.065, 0.181, 0.182], - [1.238, 0.342, 0.331], - [1.783, 0.45, 0.451], - [1.242, 0.385, 0.388], - [1.194, 0.374, 0.376], - [1.794, 0.664, 0.667], - [0.695, 0.08, 0.083], - [3.493, 1.186, 1.179], - [0.85, 0.108, 0.107], - [6.841, 0.702, 0.701], - [8.047, 0.75, 0.751], - [13.426, 1.078, 1.106], - [10.389, 0.646, 0.638], - [2.358, 0.264, 0.264], - [0.965, 0.202, 0.198], - [2.363, 0.269, 0.27], - [6.768, 0.438, 0.43], - [6.525, 1.463, 1.459], - [0.569, 0.09, 0.09], - [1.708, 0.341, 0.338], - [4.702, 0.422, 0.417], - [3.954, 1.23, 1.238], - [6.964, 1.246, 1.237], - [6.965, 1.233, 1.225], - [1.018, 0.358, 0.353], - [0.67, 0.143, 0.143], - [0.583, 0.085, 0.085], - [0.637, 0.111, 0.111], - [0.778, 0.228, 0.224], - [0.683, 0.083, 0.082], - [0.678, 0.081, 0.08], - [0.679, 0.086, 0.086] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/c8g.metal-48xl.json b/opteryx-skene/results/20261004/c8g.metal-48xl.json deleted file mode 100644 index 895eb44c64..0000000000 --- a/opteryx-skene/results/20261004/c8g.metal-48xl.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "c8g.metal-48xl", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 79, - "data_size": 11705606444, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.62, 0.068, 0.067], - [0.751, 0.109, 0.106], - [0.633, 0.068, 0.067], - [0.628, 0.068, 0.068], - [1.116, 0.236, 0.25], - [1.049, 0.217, 0.212], - [0.504, 0.068, 0.068], - [0.657, 0.115, 0.113], - [1.224, 0.434, 0.437], - [1.355, 0.483, 0.482], - [0.932, 0.194, 0.191], - [0.989, 0.222, 0.226], - [1.079, 0.275, 0.275], - [1.646, 0.359, 0.367], - [1.18, 0.286, 0.292], - [0.983, 0.306, 0.316], - [1.692, 0.532, 0.521], - [0.59, 0.09, 0.09], - [3.4, 0.899, 0.901], - [0.722, 0.122, 0.123], - [6.848, 0.883, 0.883], - [8.062, 0.943, 0.917], - [13.438, 1.199, 1.216], - [10.252, 0.794, 0.767], - [2.296, 0.283, 0.298], - [1.042, 0.207, 0.206], - [2.295, 0.303, 0.293], - [6.763, 0.5, 0.501], - [6.387, 1.003, 1.021], - [0.545, 0.097, 0.096], - [1.668, 0.34, 0.335], - [4.641, 0.506, 0.507], - [4.17, 1.588, 1.808], - [7.048, 1.236, 1.201], - [7.041, 1.209, 1.197], - [0.973, 0.33, 0.312], - [0.663, 0.155, 0.149], - [0.553, 0.097, 0.097], - [0.621, 0.123, 0.119], - [0.839, 0.232, 0.231], - [0.704, 0.09, 0.093], - [0.697, 0.088, 0.089], - [0.697, 0.096, 0.095] -] - } - \ No newline at end of file diff --git a/opteryx-skene/results/20261004/t3a.small.json b/opteryx-skene/results/20261004/t3a.small.json deleted file mode 100644 index 033c0ebb1c..0000000000 --- a/opteryx-skene/results/20261004/t3a.small.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "system": "Opteryx", - "date": "2026-10-04", - "machine": "t3a.small", - "cluster_size": 1, - "proprietary": "no", - "hardware": "cpu", - "tuned": "no", - "tags": ["C++","stateless","column-oriented","embedded"], - "load_time": 7534, - "data_size": 11689868024, - "concurrent_qps": null, - "concurrent_error_ratio": null, - "result": [ - [0.91, 0.192, 0.19], - [2.173, 1.314, 1.332], - [0.844, 0.174, 0.18], - [0.876, 0.203, 0.197], - [7.143, 5.897, 5.844], - [5.075, 4.04, 3.954], - [0.918, 0.182, 0.181], - [2.15, 1.323, 1.331], - [7.903, 6.408, 6.453], - [9.41, 8.045, 8.003], - [2.812, 1.522, 1.508], - [3.011, 1.937, 1.873], - [6.229, 5.471, 5.363], - [16.301, 12.321, 12.659], - [7.782, 6.859, 6.566], - [7.698, 7.304, 6.94], - [50.759, 47.284, 47.963], - [1.089, 0.282, 0.287], - [183.661, 188.597, 190.973], - [1.627, 0.73, 0.723], - [11.1, 10.566, 10.787], - [13.027, 12.288, 12.494], - [20.134, 19.616, 20.241], - [13.652, 13.154, 13.35], - [4.797, 3.045, 3.067], - [3.639, 2.473, 2.414], - [4.98, 3.207, 3.058], - [8.28, 7.805, 7.75], - [71.921, 88.224, 82.53], - [0.905, 0.267, 0.254], - [7.047, 5.285, 5.444], - [8.465, 7.753, 7.781], - [335.058, 339.298, 335.222], - [82.646, 83.351, 156.733], - [479.587, 472.445, 479.428], - [10.856, 6.839, 6.726], - [1.315, 0.607, 0.605], - [1.014, 0.325, 0.321], - [1.121, 0.409, 0.416], - [1.925, 1.126, 1.096], - [0.984, 0.275, 0.292], - [0.957, 0.27, 0.312], - [0.954, 0.278, 0.282] -] - } - \ No newline at end of file diff --git a/opteryx-skene/start b/opteryx-skene/start deleted file mode 100755 index 06bd986563..0000000000 --- a/opteryx-skene/start +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -exit 0 diff --git a/opteryx-skene/stop b/opteryx-skene/stop deleted file mode 100755 index 06bd986563..0000000000 --- a/opteryx-skene/stop +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -exit 0 diff --git a/opteryx/README.md b/opteryx/README.md index b3f4fc5c75..3fb20496d5 100644 --- a/opteryx/README.md +++ b/opteryx/README.md @@ -81,7 +81,7 @@ This is the same shape as the pandas/polars entries. no runtime dependencies, so `install` is a single binary-wheel download with no on-box compilation and no toolchain. -`install` pins the release (`opteryx-core==0.9.155`, the latest release when +`install` pins the release (`opteryx-core==0.9.164`, the latest release when this entry was drafted) and fails if the imported version differs, so a published result names the build that produced it. diff --git a/opteryx/install b/opteryx/install index 10ce317c7e..ac284b63f9 100755 --- a/opteryx/install +++ b/opteryx/install @@ -30,7 +30,7 @@ fi "$HOME/opteryx_venv/bin/python" -m pip install --upgrade pip # Pinned so a published result is reproducible against a named release. -OPTERYX_VERSION=0.9.155 +OPTERYX_VERSION=0.9.164 "$HOME/opteryx_venv/bin/python" -m pip install "opteryx-core==${OPTERYX_VERSION}" # Fail loudly here rather than 43 queries later if pip silently fell back to a diff --git a/opteryx/results/20261012/c6a.2xlarge.json b/opteryx/results/20261012/c6a.2xlarge.json new file mode 100644 index 0000000000..9caa5ac73c --- /dev/null +++ b/opteryx/results/20261012/c6a.2xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c6a.2xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.619, 0.004, 0.003], + [0.877, 0.202, 0.199], + [1.112, 0.26, 0.26], + [1.119, 0.183, 0.179], + [1.829, 0.97, 0.921], + [1.76, 0.625, 0.621], + [0.81, 0.004, 0.003], + [1.022, 0.201, 0.202], + [2.03, 1.051, 1.003], + [2.333, 1.334, 1.305], + [1.161, 0.224, 0.227], + [1.227, 0.252, 0.249], + [1.908, 0.724, 0.721], + [2.963, 1.059, 1.044], + [1.8, 0.81, 0.793], + [1.883, 0.875, 0.875], + [3.039, 1.715, 1.679], + [0.861, 0.03, 0.031], + [5.333, 3.187, 3.08], + [0.85, 0.049, 0.049], + [9.923, 0.573, 0.584], + [11.324, 0.767, 0.765], + [19.395, 2.51, 1.622], + [2.089, 0.458, 0.479], + [1.076, 0.144, 0.143], + [1.54, 0.433, 0.426], + [1.07, 0.145, 0.143], + [9.936, 1.944, 1.196], + [9.262, 4.68, 4.186], + [0.789, 0.178, 0.179], + [2.58, 0.874, 0.883], + [6.26, 0.986, 0.987], + [6.472, 4.119, 4.117], + [10.309, 25.593, 102.564], + [10.303, 18.908, 89.311], + [1.692, 0.874, 0.866], + [0.927, 0.16, 0.153], + [0.96, 0.069, 0.073], + [0.943, 0.063, 0.068], + [1.348, 0.363, 0.357], + [0.919, 0.047, 0.049], + [0.925, 0.043, 0.043], + [0.933, 0.048, 0.051] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/c6a.4xlarge.json b/opteryx/results/20261012/c6a.4xlarge.json new file mode 100644 index 0000000000..3a7dcdfb1d --- /dev/null +++ b/opteryx/results/20261012/c6a.4xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c6a.4xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.585, 0.004, 0.003], + [0.968, 0.106, 0.106], + [0.996, 0.145, 0.145], + [1.101, 0.117, 0.119], + [1.212, 0.569, 0.57], + [1.486, 0.456, 0.458], + [0.805, 0.004, 0.003], + [0.929, 0.108, 0.109], + [1.798, 0.854, 0.813], + [1.987, 1.033, 1.019], + [1.147, 0.163, 0.163], + [0.887, 0.171, 0.172], + [1.37, 0.622, 0.55], + [2.846, 0.797, 0.815], + [1.453, 0.649, 0.63], + [1.599, 0.659, 0.638], + [2.938, 1.417, 1.348], + [0.807, 0.028, 0.03], + [5.228, 2.601, 2.63], + [0.774, 0.053, 0.05], + [9.954, 0.414, 0.402], + [11.285, 0.503, 0.496], + [19.335, 0.769, 0.791], + [2.088, 0.39, 0.37], + [1.034, 0.153, 0.124], + [1.414, 0.337, 0.336], + [1.04, 0.147, 0.121], + [10.124, 0.9, 0.973], + [9.009, 3.388, 3.32], + [0.675, 0.112, 0.113], + [2.442, 0.686, 0.691], + [6.159, 0.859, 0.952], + [6.527, 3.534, 3.617], + [10.33, 3.021, 3.109], + [10.284, 3.159, 3.036], + [1.274, 0.621, 0.647], + [1.138, 0.165, 0.156], + [0.984, 0.071, 0.061], + [0.919, 0.061, 0.064], + [1.393, 0.35, 0.397], + [0.952, 0.047, 0.042], + [0.837, 0.039, 0.044], + [0.931, 0.047, 0.042] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/c6a.large.json b/opteryx/results/20261012/c6a.large.json new file mode 100644 index 0000000000..76cc980335 --- /dev/null +++ b/opteryx/results/20261012/c6a.large.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c6a.large", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.64, 0.004, 0.004], + [1.522, 0.824, 0.817], + [1.808, 1.126, 1.134], + [1.727, 0.785, 0.764], + [4.326, 3.26, 3.266], + [4.041, 3.15, 3.075], + [0.793, 0.004, 0.004], + [1.658, 0.823, 0.819], + [4.486, 3.124, 3.073], + [5.899, 4.385, 4.364], + [1.889, 0.845, 0.842], + [2.023, 0.941, 0.942], + [4.616, 3.281, 3.18], + [6.105, 4.53, 4.451], + [4.981, 3.687, 3.642], + [4.409, 3.076, 2.98], + [19.087, 41.892, 61.717], + [0.805, 0.089, 0.086], + [102.115, 446.267, 554.806], + [1.009, 0.188, 0.193], + [10.082, 4.678, 4.639], + [11.297, 5.436, 5.359], + [19.479, 20.491, 16.457], + [2.962, 1.905, 1.83], + [1.53, 0.622, 0.628], + [3.261, 2.273, 2.423], + [1.494, 0.652, 0.606], + [10.132, 5.819, 5.852], + [20.435, 57.744, 43.063], + [1.502, 0.667, 0.666], + [5.178, 3.836, 3.832], + [6.656, 4.067, 3.904], + [213.646, 599.296, 628.752], + [54.705, 375.818, 495.907], + [59.039, 768.805, 991.852], + [4.066, 2.906, 2.936], + [1.169, 0.351, 0.34], + [0.982, 0.142, 0.134], + [0.993, 0.119, 0.108], + [1.488, 0.533, 0.517], + [0.939, 0.08, 0.086], + [0.924, 0.082, 0.081], + [0.933, 0.079, 0.078] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/c6a.metal.json b/opteryx/results/20261012/c6a.metal.json new file mode 100644 index 0000000000..f0438b67bf --- /dev/null +++ b/opteryx/results/20261012/c6a.metal.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c6a.metal", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.539, 0.008, 0.006], + [0.684, 0.139, 0.116], + [0.791, 0.132, 0.149], + [0.913, 0.156, 0.16], + [0.938, 0.289, 0.279], + [1.29, 0.3, 0.29], + [0.544, 0.008, 0.006], + [0.723, 0.128, 0.146], + [1.403, 0.63, 0.627], + [1.691, 0.649, 0.624], + [0.978, 0.203, 0.196], + [1.03, 0.235, 0.217], + [1.384, 0.325, 0.328], + [2.634, 0.396, 0.372], + [1.402, 0.35, 0.34], + [1.147, 0.358, 0.362], + [2.718, 0.716, 0.722], + [0.609, 0.027, 0.026], + [4.851, 1.124, 1.02], + [0.811, 0.126, 0.124], + [9.931, 0.305, 0.269], + [11.394, 0.367, 0.315], + [19.5, 0.56, 0.432], + [9.225, 0.874, 1.027], + [3.128, 0.293, 0.273], + [1.286, 0.235, 0.203], + [3.112, 0.301, 0.269], + [10.009, 0.596, 0.523], + [8.866, 1.453, 1.44], + [0.75, 0.166, 0.162], + [2.62, 0.337, 0.319], + [6.199, 0.539, 0.522], + [5.737, 1.764, 1.77], + [10.339, 1.502, 1.567], + [10.335, 1.478, 1.452], + [1.064, 0.329, 0.326], + [0.835, 0.177, 0.177], + [0.638, 0.069, 0.069], + [0.869, 0.07, 0.066], + [1.265, 0.418, 0.416], + [0.83, 0.055, 0.05], + [0.82, 0.046, 0.046], + [0.821, 0.055, 0.054] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/c6a.xlarge.json b/opteryx/results/20261012/c6a.xlarge.json new file mode 100644 index 0000000000..c10b26f90c --- /dev/null +++ b/opteryx/results/20261012/c6a.xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c6a.xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.687, 0.004, 0.003], + [1.143, 0.4, 0.399], + [1.26, 0.56, 0.547], + [1.407, 0.38, 0.388], + [2.689, 1.836, 1.818], + [2.457, 1.52, 1.469], + [0.833, 0.004, 0.003], + [1.253, 0.398, 0.398], + [2.814, 1.625, 1.652], + [3.436, 2.283, 2.264], + [1.517, 0.42, 0.422], + [1.571, 0.461, 0.462], + [2.734, 1.617, 1.585], + [3.581, 2.267, 2.228], + [2.896, 1.753, 1.758], + [2.691, 1.543, 1.525], + [4.743, 3.367, 3.287], + [0.946, 0.048, 0.048], + [12.203, 50.389, 139.961], + [0.928, 0.097, 0.103], + [10.065, 2.277, 2.265], + [11.345, 2.597, 2.605], + [19.445, 4.263, 4.26], + [2.282, 0.976, 0.987], + [1.233, 0.326, 0.321], + [2.118, 1.109, 1.092], + [1.26, 0.334, 0.328], + [10.176, 2.875, 2.846], + [9.988, 8.312, 8.254], + [1.203, 0.34, 0.332], + [3.177, 1.875, 1.84], + [6.486, 1.967, 1.934], + [36.77, 187.9, 189.03], + [10.957, 124.677, 215.34], + [18.1, 111.061, 313.633], + [2.467, 1.515, 1.515], + [1.111, 0.215, 0.163], + [0.976, 0.085, 0.084], + [1.018, 0.07, 0.075], + [1.428, 0.365, 0.398], + [0.977, 0.053, 0.048], + [0.951, 0.054, 0.054], + [0.946, 0.059, 0.056] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/c7a.metal-48xl.json b/opteryx/results/20261012/c7a.metal-48xl.json new file mode 100644 index 0000000000..3e3c3ac57e --- /dev/null +++ b/opteryx/results/20261012/c7a.metal-48xl.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c7a.metal-48xl", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.704, 0.007, 0.007], + [0.864, 0.139, 0.122], + [0.819, 0.143, 0.134], + [1.009, 0.141, 0.129], + [1.077, 0.19, 0.201], + [1.423, 0.202, 0.202], + [0.66, 0.008, 0.007], + [0.838, 0.141, 0.129], + [1.458, 0.426, 0.41], + [1.743, 0.451, 0.465], + [1.085, 0.19, 0.174], + [1.111, 0.211, 0.198], + [1.46, 0.258, 0.249], + [2.74, 0.292, 0.283], + [1.497, 0.271, 0.269], + [1.203, 0.284, 0.247], + [2.824, 0.389, 0.372], + [0.722, 0.025, 0.024], + [4.921, 0.729, 0.592], + [0.898, 0.131, 0.117], + [10.054, 0.247, 0.209], + [11.487, 0.307, 0.233], + [19.591, 0.354, 0.291], + [9.234, 0.721, 0.576], + [3.243, 0.206, 0.209], + [1.415, 0.172, 0.197], + [3.224, 0.204, 0.211], + [10.092, 0.299, 0.3], + [9.03, 0.662, 0.664], + [0.869, 0.159, 0.163], + [2.718, 0.279, 0.246], + [6.332, 0.312, 0.298], + [5.812, 1.262, 1.3], + [10.443, 0.837, 0.812], + [10.454, 0.868, 0.848], + [1.165, 0.24, 0.232], + [0.96, 0.168, 0.17], + [0.817, 0.067, 0.064], + [0.805, 0.065, 0.061], + [1.192, 0.404, 0.398], + [0.75, 0.048, 0.047], + [0.751, 0.043, 0.043], + [0.769, 0.049, 0.048] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/c8g.4xlarge.json b/opteryx/results/20261012/c8g.4xlarge.json new file mode 100644 index 0000000000..d926bf1f73 --- /dev/null +++ b/opteryx/results/20261012/c8g.4xlarge.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c8g.4xlarge", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.593, 0.004, 0.003], + [0.643, 0.054, 0.054], + [0.664, 0.08, 0.079], + [0.883, 0.053, 0.054], + [0.949, 0.211, 0.218], + [1.235, 0.186, 0.182], + [0.568, 0.004, 0.003], + [0.638, 0.054, 0.055], + [1.401, 0.439, 0.441], + [1.535, 0.509, 0.514], + [0.928, 0.075, 0.075], + [0.94, 0.088, 0.087], + [1.292, 0.21, 0.22], + [2.585, 0.305, 0.296], + [1.296, 0.242, 0.244], + [0.934, 0.233, 0.228], + [2.584, 0.444, 0.432], + [0.649, 0.02, 0.02], + [4.661, 0.812, 0.812], + [0.792, 0.023, 0.021], + [9.928, 0.218, 0.204], + [11.341, 0.251, 0.261], + [19.615, 0.368, 0.369], + [2.098, 0.252, 0.253], + [0.839, 0.078, 0.062], + [1.242, 0.148, 0.137], + [0.776, 0.08, 0.061], + [9.969, 0.218, 0.208], + [8.804, 1.296, 1.277], + [0.684, 0.075, 0.071], + [2.459, 0.246, 0.248], + [6.105, 0.275, 0.255], + [4.972, 0.972, 0.984], + [10.133, 0.979, 0.932], + [10.116, 1.002, 0.958], + [0.956, 0.249, 0.243], + [0.778, 0.122, 0.12], + [0.685, 0.056, 0.056], + [0.693, 0.052, 0.048], + [0.939, 0.267, 0.258], + [0.635, 0.035, 0.034], + [0.625, 0.031, 0.033], + [0.702, 0.038, 0.038] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/c8g.metal-48xl.json b/opteryx/results/20261012/c8g.metal-48xl.json new file mode 100644 index 0000000000..81a9631e67 --- /dev/null +++ b/opteryx/results/20261012/c8g.metal-48xl.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "c8g.metal-48xl", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.505, 0.004, 0.003], + [0.579, 0.077, 0.069], + [0.614, 0.068, 0.077], + [1.19, 0.068, 0.058], + [0.915, 0.129, 0.131], + [1.252, 0.143, 0.155], + [0.52, 0.004, 0.003], + [0.616, 0.066, 0.073], + [1.254, 0.337, 0.327], + [1.551, 0.347, 0.367], + [0.89, 0.117, 0.094], + [0.932, 0.119, 0.127], + [1.272, 0.182, 0.193], + [2.585, 0.218, 0.223], + [1.31, 0.185, 0.217], + [0.917, 0.162, 0.192], + [2.622, 0.297, 0.358], + [0.551, 0.019, 0.017], + [4.679, 0.528, 0.578], + [0.69, 0.057, 0.055], + [9.879, 0.132, 0.131], + [11.354, 0.143, 0.145], + [19.604, 0.181, 0.174], + [9.039, 0.452, 0.458], + [3.124, 0.13, 0.142], + [1.243, 0.125, 0.146], + [3.118, 0.138, 0.134], + [9.932, 0.17, 0.237], + [8.577, 0.668, 0.671], + [0.635, 0.085, 0.083], + [2.553, 0.173, 0.188], + [6.2, 0.198, 0.19], + [5.455, 1.19, 1.111], + [10.14, 0.632, 0.663], + [10.137, 0.661, 0.623], + [0.812, 0.169, 0.168], + [0.707, 0.121, 0.118], + [0.604, 0.056, 0.054], + [0.624, 0.051, 0.052], + [1.009, 0.27, 0.272], + [0.708, 0.035, 0.036], + [0.698, 0.032, 0.031], + [0.692, 0.039, 0.038] +] + } + \ No newline at end of file diff --git a/opteryx/results/20261012/t3a.small.json b/opteryx/results/20261012/t3a.small.json new file mode 100644 index 0000000000..94974ed405 --- /dev/null +++ b/opteryx/results/20261012/t3a.small.json @@ -0,0 +1,60 @@ +{ + "system": "Opteryx (Parquet, partitioned)", + "date": "2026-10-12", + "machine": "t3a.small", + "cluster_size": 1, + "proprietary": "no", + "hardware": "cpu", + "tuned": "no", + "tags": ["C++","stateless","column-oriented","embedded"], + "load_time": 0, + "data_size": 14737666736, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [0.948, 0.008, 0.007], + [2.267, 1.276, 1.269], + [2.839, 1.764, 1.745], + [2.307, 1.201, 1.182], + [7.195, 5.725, 5.863], + [6.856, 5.576, 5.544], + [0.956, 0.007, 0.007], + [2.265, 1.259, 1.277], + [7.78, 6.574, 6.562], + [10.273, 9.369, 10.733], + [2.69, 1.411, 1.38], + [2.855, 1.585, 1.618], + [7.961, 10.739, 27.676], + [22.233, 73.851, 127.577], + [8.793, 14.177, 30.729], + [12.261, 19.59, 23.754], + [50.889, 216.65, 264.134], + [1.146, 0.147, 0.144], + [168.385, 610.755, 654.974], + [1.641, 0.348, 0.349], + [11.138, 11.005, 12.213], + [12.396, 12.483, 13.993], + [22.116, 23.361, 24.264], + [5.3, 3.671, 3.962], + [2.772, 1.19, 1.184], + [6.01, 4.267, 4.219], + [2.79, 1.244, 1.165], + [14.906, 16.934, 16.34], + [115.98, 192.147, 220.001], + [2.337, 1.124, 1.089], + [10.1, 18.747, 10.907], + [21.888, 44.016, 54.852], + [308.5, 849.855, 751.878], + [94.115, 529.128, 605.725], + [92.468, 504.585, 590.76], + [8.078, 6.738, 6.456], + [1.614, 0.576, 0.517], + [1.298, 0.24, 0.25], + [1.304, 0.244, 0.281], + [2.167, 0.928, 0.908], + [1.166, 0.139, 0.13], + [1.123, 0.136, 0.133], + [1.153, 0.145, 0.138] +] + } + \ No newline at end of file