diff --git a/bench/adapters/datafusion_adapter.py b/bench/adapters/datafusion_adapter.py index 1c36464..ec41466 100644 --- a/bench/adapters/datafusion_adapter.py +++ b/bench/adapters/datafusion_adapter.py @@ -55,23 +55,25 @@ def _ensure_ctx(self) -> SessionContext: def load_data(self, path: Path, table_name: str = "data") -> None: ctx = self._ensure_ctx() df_table = f"bench_{table_name}" - # register_csv reads lazily; force materialization by collecting - # into an in-memory table so subsequent timed queries don't pay - # for disk reads. + # Read CSV once and register the materialized RecordBatches as + # an in-memory table. Without this, register_csv produces a + # listing table that re-parses CSV on every query — page cache + # avoids disk I/O but the parse cost remains, tilting timing + # against DataFusion vs adapters that hold native columnar + # storage (duckdb/chdb/polars/pandas/rayforce all do). try: ctx.deregister_table(df_table) except Exception: pass - ctx.register_csv(df_table, str(path)) - # Materialize: read all batches, register as memtable. - batches = ctx.sql(f"SELECT * FROM {df_table}").collect() - ctx.deregister_table(df_table) - from datafusion import RecordBatchStream # noqa: F401 - # The simplest robust path: keep CSV registered but warm OS page - # cache by collecting once. Re-register to drop any stream state. - ctx.register_csv(df_table, str(path)) - # Warm by collecting once (already done above). - del batches + csv_tmp = f"{df_table}__csv" + try: + ctx.deregister_table(csv_tmp) + except Exception: + pass + ctx.register_csv(csv_tmp, str(path)) + batches = ctx.sql(f"SELECT * FROM {csv_tmp}").collect() + ctx.deregister_table(csv_tmp) + ctx.register_record_batches(df_table, [batches]) self._table_names[table_name] = df_table def _get_table(self, name: str = "data") -> str: diff --git a/bench/adapters/questdb_adapter.py b/bench/adapters/questdb_adapter.py index 650f945..f2c2d60 100644 --- a/bench/adapters/questdb_adapter.py +++ b/bench/adapters/questdb_adapter.py @@ -96,10 +96,15 @@ def load_data(self, path: Path, table_name: str = "data") -> None: float_cols = [name for name, dtype in df.schema.items() if dtype == pl.Float64] str_cols = [name for name, dtype in df.schema.items() if dtype in (pl.Utf8, pl.String)] - # Use ILP for fast ingestion + # Use ILP for ingestion. Flush every FLUSH_EVERY rows so the + # server can start committing before send finishes — without + # periodic flush, all rows sit in the sender's local buffer until + # the with-block exits, making first-commit visibility race + # against the polling deadline below. + FLUSH_EVERY = 100_000 conf = f"tcp::addr={self._host}:{self._ilp_port};" with self._Sender.from_conf(conf) as sender: - for row in df.iter_rows(named=True): + for i, row in enumerate(df.iter_rows(named=True)): sender.row( sql_table_name, symbols={col: row[col] for col in str_cols}, @@ -109,16 +114,19 @@ def load_data(self, path: Path, table_name: str = "data") -> None: }, at=self._ServerTimestamp, ) + if (i + 1) % FLUSH_EVERY == 0: + sender.flush() sender.flush() # ILP is async — the rows (and even the table itself, on a first # write) aren't queryable until QuestDB commits them (default - # cadence ~1s). Block until count() matches the load, treating any - # error from the SELECT as "not visible yet". + # cadence ~1s). For multi-million-row loads the commit chases + # the send tail by tens of seconds; 5-minute deadline covers the + # canonical-join `big` (N=10M) without false ILP timeouts. import time as _time expected = df.height actual = 0 - deadline = _time.time() + 30 + deadline = _time.time() + 300 while _time.time() < deadline: try: with self._conn.cursor() as cur: @@ -253,9 +261,12 @@ def _load_right(self, path: Path) -> str: float_cols = [n for n, d in df.schema.items() if d == pl.Float64] str_cols = [n for n, d in df.schema.items() if d in (pl.Utf8, pl.String)] + # Periodic flush so server commits in parallel with send — same + # rationale as load_data(). + FLUSH_EVERY = 100_000 conf = f"tcp::addr={self._host}:{self._ilp_port};" with self._Sender.from_conf(conf) as sender: - for row in df.iter_rows(named=True): + for i, row in enumerate(df.iter_rows(named=True)): sender.row( right_table, symbols={c: row[c] for c in str_cols}, @@ -265,11 +276,13 @@ def _load_right(self, path: Path) -> str: }, at=self._ServerTimestamp, ) + if (i + 1) % FLUSH_EVERY == 0: + sender.flush() sender.flush() # Wait for ILP commit visibility (same dance as load_data). expected = df.height - deadline = _time.time() + 30 + deadline = _time.time() + 300 while _time.time() < deadline: try: with self._conn.cursor() as cur: @@ -374,20 +387,24 @@ def run_sort_typed_full(self, csv_path: Path, dtype: str, # Random N-character strings are high-cardinality — push them as # STRING via ILP `columns`, not SYMBOL via `symbols` (Symbol is # a dictionary type and chokes on N=1M unique values). + # Periodic flush so server commits in parallel with send. + FLUSH_EVERY = 100_000 conf = f"tcp::addr={self._host}:{self._ilp_port};" with self._Sender.from_conf(conf) as sender: - for row in df.iter_rows(named=True): + for i, row in enumerate(df.iter_rows(named=True)): v = row["v"] sender.row(sort_table, columns={"v": v}, at=self._ServerTimestamp) + if (i + 1) % FLUSH_EVERY == 0: + sender.flush() sender.flush() - # Wait for ILP commit visibility. 1M-row ILP commits can take a - # while; raise loudly on timeout so we don't sort an empty table + # Wait for ILP commit visibility. 10M-row ILP commits can take + # minutes; raise loudly on timeout so we don't sort an empty table # and report fake 0.36ms / 0 rows. expected = df.height actual = 0 - deadline = _time.time() + 120 + deadline = _time.time() + 300 while _time.time() < deadline: try: with self._conn.cursor() as cur: diff --git a/bench/adapters/rayforce_adapter.py b/bench/adapters/rayforce_adapter.py index f1fc5fd..9986097 100644 --- a/bench/adapters/rayforce_adapter.py +++ b/bench/adapters/rayforce_adapter.py @@ -31,10 +31,10 @@ class RayforceAdapter(Adapter): "groupby_q3": 't.select(v1=Column("v1").sum(), v3=Column("v3").mean()).by("id3").execute()', "groupby_q4": 't.select(v1=Column("v1").mean(), v2=Column("v2").mean(), v3=Column("v3").mean()).by("id4").execute()', "groupby_q5": 't.select(v1=Column("v1").sum(), v2=Column("v2").sum(), v3=Column("v3").sum()).by("id6").execute()', - "groupby_q6": '# NYI: rayforce engine does not support median + multi-key by()', + "groupby_q6": 't.select(v3_median=Column("v3").median(), v3_std=Column("v3").std()).by("id4","id5").execute()', "groupby_q7": '# Two-stage workaround for engine NYI on arithmetic-of-aggregates per-group:\nagg = t.select(v1m=Column("v1").max(), v2m=Column("v2").min()).by("id3").execute()\nagg.select("id3", range_v1_v2=Column("v1m") - Column("v2m")).execute()', - "groupby_q8": '# NYI: rayforce-py has no top-N / per-group head(n)', - "groupby_q9": '# NYI: rayforce-py has no Column.corr / pearson_corr', + "groupby_q8": 't.select(largest2_v3=Column("v3").top(2)).by("id6").execute()', + "groupby_q9": '# Two-stage: pearson_corr at top first, then square the result\nagg = t.select(r=Column("v1").pearson_corr(Column("v2"))).by("id2","id4").execute()\nagg.select("id2", "id4", r2=Column("r")*Column("r")).execute()', "groupby_q10": 't.select(v3=Column("v3").sum(), cnt=Column("v1").count()).by("id1","id2","id3","id4","id5","id6").execute()', "join_q1": '# pre-project right to (key, v2) to avoid to_dict() collapse on dup cols\nx.inner_join(small.select("id1","v2").execute(), on=["id1"]).execute()', "join_q2": 'x.inner_join(medium.select("id2","v2").execute(), on=["id2"]).execute()', @@ -272,20 +272,15 @@ def run_groupby_q5(self) -> BenchmarkResult: ) def run_groupby_q6(self) -> BenchmarkResult: - """Q6: median(v3), sd(v3) by id4, id5 — canonical H2O. - - rayforce-py 2.0a1 exposes Column.median() and the engine has a - DEVIATION op (callable as Expression(Operation.DEVIATION, col)), - so individually both aggregates are available. But the engine - itself raises `RayforceNYIError: non-agg expression with - multi-key or computed group key` when median is combined with - a multi-key `.by(...)` — the canonical q6 groups by (id4, id5). - Single-key median works; multi-key median doesn't. - See REQUIREMENTS_CANONICAL_H2O.md §1.1. - """ - raise NotImplementedError( - "rayforce engine NYI: 'median(...) with multi-key group-by' " - "(median+sd by id4,id5 needed for canonical H2O q6)") + """Q6: median(v3), sd(v3) by id4, id5 — canonical H2O.""" + t = self._get_table_obj() + C = self._Column + return self._timed( + lambda: t.select(v3_median=C("v3").median(), + v3_std=C("v3").std() + ).by("id4", "id5").execute(), + "groupby_q6", + ) def run_groupby_q7(self) -> BenchmarkResult: """Q7: max(v1) - min(v2) by id3 — canonical H2O. @@ -309,25 +304,43 @@ def query(): def run_groupby_q8(self) -> BenchmarkResult: """Q8: largest two v3 by id6 — canonical H2O. - rayforce-py 2.0a1 has no head(N) / top-N / window functions; - cannot compute per-group top-N. NYI until upstream adds one of - Column.head(n) / per-group ROW_NUMBER. See REQUIREMENTS §1.3. + The engine's OP_GROUP_TOPK_ROWFORM operator emits row form + directly (one row per kept-value, not nested LIST[K] + cells), so the natural chained API matches DuckDB/polars's + 2-rows-per-group shape (200k rows for 100k id6 groups) without + any adapter-side explode. """ - raise NotImplementedError( - "rayforce-py has no top-N / per-group head(n); " - "canonical H2O q8 needs largest two v3 by group") + t = self._get_table_obj() + C = self._Column + return self._timed( + lambda: t.select(largest2_v3=C("v3").top(2) + ).by("id6").execute(), + "groupby_q8", + ) def run_groupby_q9(self) -> BenchmarkResult: - """Q9: corr(v1, v2)^2 by id2, id4 — canonical H2O. - - rayforce-py 2.0a1 has no corr/pearson_corr/cov, and no - Column-level arithmetic to construct corr manually. NYI until - upstream adds Column.corr(other) or Column arithmetic + - sum/var. See REQUIREMENTS §1.4. + """Q9: pearson_corr(v1, v2)**2 by id2, id4 — canonical H2O. + + Two-stage workaround mirroring run_groupby_q7: the planner only + lowers a *top-level* agg call to its hash-agg opcode. Writing + ``C("v1").pearson_corr(...) ** 2`` puts ``pow`` at the head of + the select expression — pow is not an aggregator, so the inner + ``pearson_corr`` collapses through the eval-level scatter + fallback and never hits OP_PEARSON_CORR. Splitting the squaring + into a second select against the aggregated result keeps the + first stage purely aggregatory (single ``pearson_corr`` per + group → OP_PEARSON_CORR vectorized hash-agg) and the second + stage trivial element-wise arithmetic. """ - raise NotImplementedError( - "rayforce-py has no Column.corr / pearson_corr / cov; " - "canonical H2O q9 needs correlation by group") + t = self._get_table_obj() + C = self._Column + + def query(): + agg = t.select(r=C("v1").pearson_corr(C("v2")) + ).by("id2", "id4").execute() + return agg.select("id2", "id4", r2=C("r") * C("r")).execute() + + return self._timed(query, "groupby_q9") def run_groupby_q10(self) -> BenchmarkResult: """Q10: sum(v3), count(v1) by id1..id6 — canonical H2O.""" @@ -395,20 +408,38 @@ def run_join_q5(self) -> BenchmarkResult: lambda: x.inner_join(r, on=["id3"]).execute(), "join_q5") def run_join_inner(self, right_path: Path) -> BenchmarkResult: - """Inner join on (id1, id2, id3) — canonical H2O J1.""" + """Inner join on (id1, id2, id3) — canonical H2O J1. + + Pre-project right to (id1, id2, id3, v2) so the engine doesn't + emit duplicate-name columns (id4..id6, v1 exist on both sides); + Table.to_dict() collapses dup-name keys, which corrupts the + left-side values. This matches the canonical H2O answer + "left-side cols + right.v2" already enforced by check.py. + """ L = self._get_table_obj("left") R = self._load_table_from_csv(right_path) + C = self._Column return self._timed( - lambda: L.inner_join(R, on=["id1", "id2", "id3"]).execute(), + lambda: L.inner_join( + R.select("id1", "id2", "id3", "v2").execute(), + on=["id1", "id2", "id3"], + ).execute(), "join_inner", ) def run_join_left(self, right_path: Path) -> BenchmarkResult: - """Left join on (id1, id2, id3) — canonical H2O J1.""" + """Left join on (id1, id2, id3) — canonical H2O J1. + + Same pre-project trick as run_join_inner — see its docstring. + """ L = self._get_table_obj("left") R = self._load_table_from_csv(right_path) + C = self._Column return self._timed( - lambda: L.left_join(R, on=["id1", "id2", "id3"]).execute(), + lambda: L.left_join( + R.select("id1", "id2", "id3", "v2").execute(), + on=["id1", "id2", "id3"], + ).execute(), "join_left", ) @@ -475,8 +506,11 @@ def materialize(self, op: str, right_path: Path | None = None): elif op in ("join_inner", "join_left"): L = self._get_table_obj("left") R = self._load_table_from_csv(right_path) + # Pre-project right to (keys, v2) — see run_join_inner for + # rationale (Table.to_dict() collapses dup-name columns). + R_proj = R.select("id1", "id2", "id3", "v2").execute() kind = L.inner_join if op == "join_inner" else L.left_join - result = kind(R, on=["id1", "id2", "id3"]).execute() + result = kind(R_proj, on=["id1", "id2", "id3"]).execute() else: t = self._get_table_obj() if op == "groupby_q1": @@ -495,10 +529,16 @@ def materialize(self, op: str, right_path: Path | None = None): v2=C("v2").sum(), v3=C("v3").sum()).by("id6").execute() elif op == "groupby_q6": - raise NotImplementedError( - "rayforce engine NYI: 'median(...) with multi-key " - "group-by' (canonical H2O q6 needs median+sd by " - "id4, id5)") + # Extra `_cnt` column lets us reconstruct n<=1 nulls in + # v3_std after to_dict() — the wrapper drops the + # typed-null bit when materialising F64 vectors, so the + # engine's correct 0Nf for sample-std-of-1 surfaces here + # as 0.0. Post-process below replaces those with NaN + # which check.py's canonicalize folds to null. + result = t.select(v3_median=C("v3").median(), + v3_std=C("v3").std(), + _cnt=C("v3").count() + ).by("id4", "id5").execute() elif op == "groupby_q7": # Two-stage workaround — see run_groupby_q7 for rationale. agg = t.select(v1m=C("v1").max(), @@ -506,13 +546,25 @@ def materialize(self, op: str, right_path: Path | None = None): result = agg.select("id3", range_v1_v2=C("v1m") - C("v2m")).execute() elif op == "groupby_q8": - raise NotImplementedError( - "rayforce-py has no top-N / per-group head(n); " - "canonical H2O q8 needs largest two v3 by group") + # Engine's OP_GROUP_TOPK_ROWFORM emits row form + # directly — one row per (id6, kept_value). Variable-K + # behaviour (groups with None: self._table_names.clear() diff --git a/docs/data.js b/docs/data.js index c2630a8..ba6cba2 100644 --- a/docs/data.js +++ b/docs/data.js @@ -1 +1 @@ -window.chartData = {"generated_at": "2026-05-08T21:19:49+03:00", "comparison": {"adapters": ["chdb", "datafusion", "duckdb", "pandas", "polars", "questdb", "rayforce", "timescale"], "tasks": ["groupby_q1", "groupby_q10", "groupby_q2", "groupby_q3", "groupby_q4", "groupby_q5", "groupby_q6", "groupby_q7", "groupby_q8", "groupby_q9", "join_inner", "join_left", "join_q1", "join_q2", "join_q3", "join_q4", "join_q5", "sort_multi", "sort_single"], "values": [{"adapter": "rayforce", "task": "groupby_q1", "median_ms": 5.824734}, {"adapter": "rayforce", "task": "groupby_q2", "median_ms": 15.773305}, {"adapter": "rayforce", "task": "groupby_q3", "median_ms": 36.67285}, {"adapter": "rayforce", "task": "groupby_q4", "median_ms": 10.797913}, {"adapter": "rayforce", "task": "groupby_q5", "median_ms": 61.089761}, {"adapter": "rayforce", "task": "groupby_q6", "median_ms": 0.0}, {"adapter": "rayforce", "task": "groupby_q7", "median_ms": 41.137825}, {"adapter": "rayforce", "task": "groupby_q8", "median_ms": 0.0}, {"adapter": "rayforce", "task": "groupby_q9", "median_ms": 0.0}, {"adapter": "rayforce", "task": "groupby_q10", "median_ms": 136.68509}, {"adapter": "polars", "task": "groupby_q1", "median_ms": 30.689921}, {"adapter": "polars", "task": "groupby_q2", "median_ms": 213.584089}, {"adapter": "polars", "task": "groupby_q3", "median_ms": 271.027953}, {"adapter": "polars", "task": "groupby_q4", "median_ms": 29.380641}, {"adapter": "polars", "task": "groupby_q5", "median_ms": 168.814247}, {"adapter": "polars", "task": "groupby_q6", "median_ms": 244.154439}, {"adapter": "polars", "task": "groupby_q7", "median_ms": 264.496787}, {"adapter": "polars", "task": "groupby_q8", "median_ms": 495.520495}, {"adapter": "polars", "task": "groupby_q9", "median_ms": 392.851922}, {"adapter": "polars", "task": "groupby_q10", "median_ms": 1948.775121}, {"adapter": "duckdb", "task": "groupby_q1", "median_ms": 33.261511}, {"adapter": "duckdb", "task": "groupby_q2", "median_ms": 48.503989}, {"adapter": "duckdb", "task": "groupby_q3", "median_ms": 96.426018}, {"adapter": "duckdb", "task": "groupby_q4", "median_ms": 8.087284}, {"adapter": "duckdb", "task": "groupby_q5", "median_ms": 100.674962}, {"adapter": "duckdb", "task": "groupby_q6", "median_ms": 175.603334}, {"adapter": "duckdb", "task": "groupby_q7", "median_ms": 96.850147}, {"adapter": "duckdb", "task": "groupby_q8", "median_ms": 173.281259}, {"adapter": "duckdb", "task": "groupby_q9", "median_ms": 72.208458}, {"adapter": "duckdb", "task": "groupby_q10", "median_ms": 1420.718039}, {"adapter": "chdb", "task": "groupby_q1", "median_ms": 37.049554}, {"adapter": "chdb", "task": "groupby_q2", "median_ms": 185.160349}, {"adapter": "chdb", "task": "groupby_q3", "median_ms": 232.491878}, {"adapter": "chdb", "task": "groupby_q4", "median_ms": 43.029803}, {"adapter": "chdb", "task": "groupby_q5", "median_ms": 195.371126}, {"adapter": "chdb", "task": "groupby_q6", "median_ms": 460.748488}, {"adapter": "chdb", "task": "groupby_q7", "median_ms": 225.359802}, {"adapter": "chdb", "task": "groupby_q8", "median_ms": 528.665069}, {"adapter": "chdb", "task": "groupby_q9", "median_ms": 200.849423}, {"adapter": "chdb", "task": "groupby_q10", "median_ms": 2717.821956}, {"adapter": "datafusion", "task": "groupby_q1", "median_ms": 110.666562}, {"adapter": "datafusion", "task": "groupby_q2", "median_ms": 166.61382}, {"adapter": "datafusion", "task": "groupby_q3", "median_ms": 265.885071}, {"adapter": "datafusion", "task": "groupby_q4", "median_ms": 167.155003}, {"adapter": "datafusion", "task": "groupby_q5", "median_ms": 263.269545}, {"adapter": "datafusion", "task": "groupby_q6", "median_ms": 262.106614}, {"adapter": "datafusion", "task": "groupby_q7", "median_ms": 248.573369}, {"adapter": "datafusion", "task": "groupby_q8", "median_ms": 370.824711}, {"adapter": "datafusion", "task": "groupby_q9", "median_ms": 208.592801}, {"adapter": "datafusion", "task": "groupby_q10", "median_ms": 570.332521}, {"adapter": "pandas", "task": "groupby_q1", "median_ms": 229.647895}, {"adapter": "pandas", "task": "groupby_q2", "median_ms": 621.61714}, {"adapter": "pandas", "task": "groupby_q3", "median_ms": 764.026452}, {"adapter": "pandas", "task": "groupby_q4", "median_ms": 233.908612}, {"adapter": "pandas", "task": "groupby_q5", "median_ms": 375.992715}, {"adapter": "pandas", "task": "groupby_q6", "median_ms": 673.779485}, {"adapter": "pandas", "task": "groupby_q7", "median_ms": 789.611511}, {"adapter": "pandas", "task": "groupby_q8", "median_ms": 6682.51042}, {"adapter": "pandas", "task": "groupby_q9", "median_ms": 7794.240162}, {"adapter": "pandas", "task": "groupby_q10", "median_ms": 6875.477569}, {"adapter": "questdb", "task": "groupby_q1", "median_ms": 10.059147}, {"adapter": "questdb", "task": "groupby_q2", "median_ms": 46.691301}, {"adapter": "questdb", "task": "groupby_q3", "median_ms": 295.832835}, {"adapter": "questdb", "task": "groupby_q4", "median_ms": 42.878789}, {"adapter": "questdb", "task": "groupby_q5", "median_ms": 191.967352}, {"adapter": "questdb", "task": "groupby_q6", "median_ms": 0.0}, {"adapter": "questdb", "task": "groupby_q7", "median_ms": 202.020358}, {"adapter": "questdb", "task": "groupby_q8", "median_ms": 31271.169311}, {"adapter": "questdb", "task": "groupby_q9", "median_ms": 76.670477}, {"adapter": "questdb", "task": "groupby_q10", "median_ms": 6486.463958}, {"adapter": "timescale", "task": "groupby_q1", "median_ms": 451.701025}, {"adapter": "timescale", "task": "groupby_q2", "median_ms": 657.685408}, {"adapter": "timescale", "task": "groupby_q3", "median_ms": 1828.913023}, {"adapter": "timescale", "task": "groupby_q4", "median_ms": 449.590928}, {"adapter": "timescale", "task": "groupby_q5", "median_ms": 1624.504323}, {"adapter": "timescale", "task": "groupby_q6", "median_ms": 4229.017522}, {"adapter": "timescale", "task": "groupby_q7", "median_ms": 1211.633235}, {"adapter": "timescale", "task": "groupby_q8", "median_ms": 3356.493516}, {"adapter": "timescale", "task": "groupby_q9", "median_ms": 658.750862}, {"adapter": "timescale", "task": "groupby_q10", "median_ms": 23274.876232}, {"adapter": "rayforce", "task": "join_q1", "median_ms": 139.626633}, {"adapter": "rayforce", "task": "join_q2", "median_ms": 137.884081}, {"adapter": "rayforce", "task": "join_q3", "median_ms": 127.8927}, {"adapter": "rayforce", "task": "join_q4", "median_ms": 124.704141}, {"adapter": "rayforce", "task": "join_q5", "median_ms": 316.303236}, {"adapter": "polars", "task": "join_q1", "median_ms": 227.369517}, {"adapter": "polars", "task": "join_q2", "median_ms": 332.310053}, {"adapter": "polars", "task": "join_q3", "median_ms": 93.6474}, {"adapter": "polars", "task": "join_q4", "median_ms": 469.305043}, {"adapter": "polars", "task": "join_q5", "median_ms": 865.532423}, {"adapter": "duckdb", "task": "join_q1", "median_ms": 1371.014224}, {"adapter": "duckdb", "task": "join_q2", "median_ms": 1637.421211}, {"adapter": "duckdb", "task": "join_q3", "median_ms": 1542.86457}, {"adapter": "duckdb", "task": "join_q4", "median_ms": 1522.447843}, {"adapter": "duckdb", "task": "join_q5", "median_ms": 2474.130783}, {"adapter": "chdb", "task": "join_q1", "median_ms": 3790.317239}, {"adapter": "chdb", "task": "join_q2", "median_ms": 4333.404806}, {"adapter": "chdb", "task": "join_q3", "median_ms": 4343.175706}, {"adapter": "chdb", "task": "join_q4", "median_ms": 3988.218096}, {"adapter": "chdb", "task": "join_q5", "median_ms": 5653.989488}, {"adapter": "datafusion", "task": "join_q1", "median_ms": 698.685422}, {"adapter": "datafusion", "task": "join_q2", "median_ms": 696.903756}, {"adapter": "datafusion", "task": "join_q3", "median_ms": 692.506079}, {"adapter": "datafusion", "task": "join_q4", "median_ms": 697.640789}, {"adapter": "datafusion", "task": "join_q5", "median_ms": 1170.396308}, {"adapter": "pandas", "task": "join_q1", "median_ms": 1039.571785}, {"adapter": "pandas", "task": "join_q2", "median_ms": 1334.793094}, {"adapter": "pandas", "task": "join_q3", "median_ms": 751.5803}, {"adapter": "pandas", "task": "join_q4", "median_ms": 1577.257524}, {"adapter": "pandas", "task": "join_q5", "median_ms": 7494.925995}, {"adapter": "questdb", "task": "join_q1", "median_ms": 15456.403114}, {"adapter": "questdb", "task": "join_q2", "median_ms": 17924.925455}, {"adapter": "questdb", "task": "join_q3", "median_ms": 18054.476508}, {"adapter": "questdb", "task": "join_q4", "median_ms": 17933.876613}, {"adapter": "questdb", "task": "join_q5", "median_ms": 40189.311438}, {"adapter": "timescale", "task": "join_q1", "median_ms": 11685.364106}, {"adapter": "timescale", "task": "join_q2", "median_ms": 13117.115676}, {"adapter": "timescale", "task": "join_q3", "median_ms": 12923.243807}, {"adapter": "timescale", "task": "join_q4", "median_ms": 13876.999323}, {"adapter": "timescale", "task": "join_q5", "median_ms": 26048.01391}, {"adapter": "rayforce", "task": "join_inner", "median_ms": 67.333512}, {"adapter": "rayforce", "task": "join_left", "median_ms": 439.064739}, {"adapter": "polars", "task": "join_inner", "median_ms": 346.188391}, {"adapter": "polars", "task": "join_left", "median_ms": 641.749333}, {"adapter": "duckdb", "task": "join_inner", "median_ms": 240.455789}, {"adapter": "duckdb", "task": "join_left", "median_ms": 2026.235215}, {"adapter": "chdb", "task": "join_inner", "median_ms": 1250.392767}, {"adapter": "chdb", "task": "join_left", "median_ms": 4225.68489}, {"adapter": "datafusion", "task": "join_inner", "median_ms": 714.064069}, {"adapter": "datafusion", "task": "join_left", "median_ms": 813.664937}, {"adapter": "pandas", "task": "join_inner", "median_ms": 5036.570364}, {"adapter": "pandas", "task": "join_left", "median_ms": 6210.174028}, {"adapter": "questdb", "task": "join_inner", "median_ms": 4239.732024}, {"adapter": "questdb", "task": "join_left", "median_ms": 14564.9725}, {"adapter": "timescale", "task": "join_inner", "median_ms": 2180.926924}, {"adapter": "timescale", "task": "join_left", "median_ms": 10424.640642}, {"adapter": "rayforce", "task": "sort_single", "median_ms": 79.849295}, {"adapter": "rayforce", "task": "sort_multi", "median_ms": 258.755638}, {"adapter": "polars", "task": "sort_single", "median_ms": 565.545102}, {"adapter": "polars", "task": "sort_multi", "median_ms": 1929.284059}, {"adapter": "duckdb", "task": "sort_single", "median_ms": 1802.66877}, {"adapter": "duckdb", "task": "sort_multi", "median_ms": 5844.444768}, {"adapter": "chdb", "task": "sort_single", "median_ms": 2390.842804}, {"adapter": "chdb", "task": "sort_multi", "median_ms": 5627.522778}, {"adapter": "datafusion", "task": "sort_single", "median_ms": 1263.511666}, {"adapter": "datafusion", "task": "sort_multi", "median_ms": 2094.198292}, {"adapter": "pandas", "task": "sort_single", "median_ms": 9536.816694}, {"adapter": "pandas", "task": "sort_multi", "median_ms": 8870.207739}, {"adapter": "questdb", "task": "sort_single", "median_ms": 17706.632356}, {"adapter": "questdb", "task": "sort_multi", "median_ms": 21468.560059}, {"adapter": "timescale", "task": "sort_single", "median_ms": 12758.780267}, {"adapter": "timescale", "task": "sort_multi", "median_ms": 22120.174409}]}, "tasks": {"groupby_q1": [{"adapter": "chdb", "values": [37.049554, 29.175246, 70.931838], "boxplot": [29.175246, 29.175246, 37.049554, 70.931838, 70.931838]}, {"adapter": "datafusion", "values": [112.497739, 109.655191, 110.666562], "boxplot": [109.655191, 109.655191, 110.666562, 112.497739, 112.497739]}, {"adapter": "duckdb", "values": [33.347455, 33.261511, 33.090625], "boxplot": [33.090625, 33.090625, 33.261511, 33.347455, 33.347455]}, {"adapter": "pandas", "values": [223.245779, 229.647895, 231.175662], "boxplot": [223.245779, 223.245779, 229.647895, 231.175662, 231.175662]}, {"adapter": "polars", "values": [29.985236, 30.689921, 30.690402], "boxplot": [29.985236, 29.985236, 30.689921, 30.690402, 30.690402]}, {"adapter": "questdb", "values": [9.943756, 10.404988, 10.059147], "boxplot": [9.943756, 9.943756, 10.059147, 10.404988, 10.404988]}, {"adapter": "rayforce", "values": [5.113977, 5.824734, 6.01083], "boxplot": [5.113977, 5.113977, 5.824734, 6.01083, 6.01083]}, {"adapter": "timescale", "values": [461.70261, 451.701025, 447.754562], "boxplot": [447.754562, 447.754562, 451.701025, 461.70261, 461.70261]}], "groupby_q10": [{"adapter": "chdb", "values": [2738.960845, 2717.821956, 2700.950929], "boxplot": [2700.950929, 2700.950929, 2717.821956, 2738.960845, 2738.960845]}, {"adapter": "datafusion", "values": [567.850061, 570.332521, 582.867448], "boxplot": [567.850061, 567.850061, 570.332521, 582.867448, 582.867448]}, {"adapter": "duckdb", "values": [1420.718039, 1467.561213, 1370.063918], "boxplot": [1370.063918, 1370.063918, 1420.718039, 1467.561213, 1467.561213]}, {"adapter": "pandas", "values": [6875.477569, 6858.229749, 6936.565808], "boxplot": [6858.229749, 6858.229749, 6875.477569, 6936.565808, 6936.565808]}, {"adapter": "polars", "values": [1948.775121, 1926.695459, 1952.751584], "boxplot": [1926.695459, 1926.695459, 1948.775121, 1952.751584, 1952.751584]}, {"adapter": "questdb", "values": [6460.019675, 6646.804895, 6486.463958], "boxplot": [6460.019675, 6460.019675, 6486.463958, 6646.804895, 6646.804895]}, {"adapter": "rayforce", "values": [136.68509, 133.69049, 138.541204], "boxplot": [133.69049, 133.69049, 136.68509, 138.541204, 138.541204]}, {"adapter": "timescale", "values": [23300.017014, 23274.876232, 22831.657517], "boxplot": [22831.657517, 22831.657517, 23274.876232, 23300.017014, 23300.017014]}], "groupby_q2": [{"adapter": "chdb", "values": [185.160349, 181.554795, 219.830719], "boxplot": [181.554795, 181.554795, 185.160349, 219.830719, 219.830719]}, {"adapter": "datafusion", "values": [167.735813, 164.897392, 166.61382], "boxplot": [164.897392, 164.897392, 166.61382, 167.735813, 167.735813]}, {"adapter": "duckdb", "values": [48.930935, 48.411253, 48.503989], "boxplot": [48.411253, 48.411253, 48.503989, 48.930935, 48.930935]}, {"adapter": "pandas", "values": [621.61714, 609.712817, 636.172884], "boxplot": [609.712817, 609.712817, 621.61714, 636.172884, 636.172884]}, {"adapter": "polars", "values": [213.75188, 211.306829, 213.584089], "boxplot": [211.306829, 211.306829, 213.584089, 213.75188, 213.75188]}, {"adapter": "questdb", "values": [52.147188, 45.731087, 46.691301], "boxplot": [45.731087, 45.731087, 46.691301, 52.147188, 52.147188]}, {"adapter": "rayforce", "values": [16.078788, 15.772053, 15.773305], "boxplot": [15.772053, 15.772053, 15.773305, 16.078788, 16.078788]}, {"adapter": "timescale", "values": [667.177378, 652.286445, 657.685408], "boxplot": [652.286445, 652.286445, 657.685408, 667.177378, 667.177378]}], "groupby_q3": [{"adapter": "chdb", "values": [231.511836, 232.491878, 235.854789], "boxplot": [231.511836, 231.511836, 232.491878, 235.854789, 235.854789]}, {"adapter": "datafusion", "values": [265.885071, 264.833613, 280.268438], "boxplot": [264.833613, 264.833613, 265.885071, 280.268438, 280.268438]}, {"adapter": "duckdb", "values": [97.585182, 94.160691, 96.426018], "boxplot": [94.160691, 94.160691, 96.426018, 97.585182, 97.585182]}, {"adapter": "pandas", "values": [763.424423, 764.026452, 768.991913], "boxplot": [763.424423, 763.424423, 764.026452, 768.991913, 768.991913]}, {"adapter": "polars", "values": [273.320111, 271.027953, 260.854293], "boxplot": [260.854293, 260.854293, 271.027953, 273.320111, 273.320111]}, {"adapter": "questdb", "values": [295.832835, 297.137286, 272.968048], "boxplot": [272.968048, 272.968048, 295.832835, 297.137286, 297.137286]}, {"adapter": "rayforce", "values": [39.959566, 36.67285, 35.802146], "boxplot": [35.802146, 35.802146, 36.67285, 39.959566, 39.959566]}, {"adapter": "timescale", "values": [1828.913023, 1817.952607, 1830.471159], "boxplot": [1817.952607, 1817.952607, 1828.913023, 1830.471159, 1830.471159]}], "groupby_q4": [{"adapter": "chdb", "values": [43.029803, 41.947507, 83.556396], "boxplot": [41.947507, 41.947507, 43.029803, 83.556396, 83.556396]}, {"adapter": "datafusion", "values": [150.069756, 170.179239, 167.155003], "boxplot": [150.069756, 150.069756, 167.155003, 170.179239, 170.179239]}, {"adapter": "duckdb", "values": [8.087284, 8.150254, 7.958077], "boxplot": [7.958077, 7.958077, 8.087284, 8.150254, 8.150254]}, {"adapter": "pandas", "values": [233.908612, 232.73989, 234.583561], "boxplot": [232.73989, 232.73989, 233.908612, 234.583561, 234.583561]}, {"adapter": "polars", "values": [29.380641, 29.386141, 28.918848], "boxplot": [28.918848, 28.918848, 29.380641, 29.386141, 29.386141]}, {"adapter": "questdb", "values": [40.82078, 42.878789, 47.873055], "boxplot": [40.82078, 40.82078, 42.878789, 47.873055, 47.873055]}, {"adapter": "rayforce", "values": [10.995961, 10.797913, 10.553997], "boxplot": [10.553997, 10.553997, 10.797913, 10.995961, 10.995961]}, {"adapter": "timescale", "values": [459.409821, 449.590928, 447.816731], "boxplot": [447.816731, 447.816731, 449.590928, 459.409821, 459.409821]}], "groupby_q5": [{"adapter": "chdb", "values": [195.371126, 200.064569, 168.839589], "boxplot": [168.839589, 168.839589, 195.371126, 200.064569, 200.064569]}, {"adapter": "datafusion", "values": [263.269545, 301.108784, 263.235611], "boxplot": [263.235611, 263.235611, 263.269545, 301.108784, 301.108784]}, {"adapter": "duckdb", "values": [103.958402, 100.674962, 100.107939], "boxplot": [100.107939, 100.107939, 100.674962, 103.958402, 103.958402]}, {"adapter": "pandas", "values": [376.575549, 375.992715, 364.349653], "boxplot": [364.349653, 364.349653, 375.992715, 376.575549, 376.575549]}, {"adapter": "polars", "values": [183.687151, 165.655004, 168.814247], "boxplot": [165.655004, 165.655004, 168.814247, 183.687151, 183.687151]}, {"adapter": "questdb", "values": [191.967352, 183.383533, 198.527186], "boxplot": [183.383533, 183.383533, 191.967352, 198.527186, 198.527186]}, {"adapter": "rayforce", "values": [62.214389, 61.089761, 60.51337], "boxplot": [60.51337, 60.51337, 61.089761, 62.214389, 62.214389]}, {"adapter": "timescale", "values": [1664.131116, 1624.504323, 1622.679472], "boxplot": [1622.679472, 1622.679472, 1624.504323, 1664.131116, 1664.131116]}], "groupby_q6": [{"adapter": "chdb", "values": [460.748488, 449.274797, 464.248522], "boxplot": [449.274797, 449.274797, 460.748488, 464.248522, 464.248522]}, {"adapter": "datafusion", "values": [271.099958, 262.106614, 261.019298], "boxplot": [261.019298, 261.019298, 262.106614, 271.099958, 271.099958]}, {"adapter": "duckdb", "values": [178.457534, 173.415576, 175.603334], "boxplot": [173.415576, 173.415576, 175.603334, 178.457534, 178.457534]}, {"adapter": "pandas", "values": [670.758036, 673.779485, 675.716304], "boxplot": [670.758036, 670.758036, 673.779485, 675.716304, 675.716304]}, {"adapter": "polars", "values": [292.841119, 217.460409, 244.154439], "boxplot": [217.460409, 217.460409, 244.154439, 292.841119, 292.841119]}, {"adapter": "questdb", "values": [], "boxplot": [0, 0, 0, 0, 0]}, {"adapter": "rayforce", "values": [], "boxplot": [0, 0, 0, 0, 0]}, {"adapter": "timescale", "values": [4300.140151, 4228.737779, 4229.017522], "boxplot": [4228.737779, 4228.737779, 4229.017522, 4300.140151, 4300.140151]}], "groupby_q7": [{"adapter": "chdb", "values": [218.712318, 227.821102, 225.359802], "boxplot": [218.712318, 218.712318, 225.359802, 227.821102, 227.821102]}, {"adapter": "datafusion", "values": [251.117758, 248.573369, 244.456998], "boxplot": [244.456998, 244.456998, 248.573369, 251.117758, 251.117758]}, {"adapter": "duckdb", "values": [96.850147, 95.302511, 97.10334], "boxplot": [95.302511, 95.302511, 96.850147, 97.10334, 97.10334]}, {"adapter": "pandas", "values": [783.775237, 789.611511, 812.500778], "boxplot": [783.775237, 783.775237, 789.611511, 812.500778, 812.500778]}, {"adapter": "polars", "values": [264.496787, 268.220027, 262.2626], "boxplot": [262.2626, 262.2626, 264.496787, 268.220027, 268.220027]}, {"adapter": "questdb", "values": [199.354898, 203.69244, 202.020358], "boxplot": [199.354898, 199.354898, 202.020358, 203.69244, 203.69244]}, {"adapter": "rayforce", "values": [43.56423, 41.137825, 40.379437], "boxplot": [40.379437, 40.379437, 41.137825, 43.56423, 43.56423]}, {"adapter": "timescale", "values": [1215.698486, 1211.633235, 1211.128534], "boxplot": [1211.128534, 1211.128534, 1211.633235, 1215.698486, 1215.698486]}], "groupby_q8": [{"adapter": "chdb", "values": [535.998094, 528.665069, 485.810722], "boxplot": [485.810722, 485.810722, 528.665069, 535.998094, 535.998094]}, {"adapter": "datafusion", "values": [352.498837, 370.824711, 399.842014], "boxplot": [352.498837, 352.498837, 370.824711, 399.842014, 399.842014]}, {"adapter": "duckdb", "values": [173.281259, 178.014908, 153.555287], "boxplot": [153.555287, 153.555287, 173.281259, 178.014908, 178.014908]}, {"adapter": "pandas", "values": [6513.795886, 7258.726115, 6682.51042], "boxplot": [6513.795886, 6513.795886, 6682.51042, 7258.726115, 7258.726115]}, {"adapter": "polars", "values": [485.337669, 552.945794, 495.520495], "boxplot": [485.337669, 485.337669, 495.520495, 552.945794, 552.945794]}, {"adapter": "questdb", "values": [31271.169311, 31251.402223, 31535.395243], "boxplot": [31251.402223, 31251.402223, 31271.169311, 31535.395243, 31535.395243]}, {"adapter": "rayforce", "values": [], "boxplot": [0, 0, 0, 0, 0]}, {"adapter": "timescale", "values": [3376.051508, 3355.88689, 3356.493516], "boxplot": [3355.88689, 3355.88689, 3356.493516, 3376.051508, 3376.051508]}], "groupby_q9": [{"adapter": "chdb", "values": [200.849423, 196.012576, 201.967037], "boxplot": [196.012576, 196.012576, 200.849423, 201.967037, 201.967037]}, {"adapter": "datafusion", "values": [233.804787, 207.899127, 208.592801], "boxplot": [207.899127, 207.899127, 208.592801, 233.804787, 233.804787]}, {"adapter": "duckdb", "values": [71.852498, 73.164323, 72.208458], "boxplot": [71.852498, 71.852498, 72.208458, 73.164323, 73.164323]}, {"adapter": "pandas", "values": [7339.298197, 7794.240162, 7873.434428], "boxplot": [7339.298197, 7339.298197, 7794.240162, 7873.434428, 7873.434428]}, {"adapter": "polars", "values": [392.851922, 452.030147, 390.87221], "boxplot": [390.87221, 390.87221, 392.851922, 452.030147, 452.030147]}, {"adapter": "questdb", "values": [73.774669, 76.670477, 81.838534], "boxplot": [73.774669, 73.774669, 76.670477, 81.838534, 81.838534]}, {"adapter": "rayforce", "values": [], "boxplot": [0, 0, 0, 0, 0]}, {"adapter": "timescale", "values": [665.001356, 658.750862, 646.994238], "boxplot": [646.994238, 646.994238, 658.750862, 665.001356, 665.001356]}], "join_inner": [{"adapter": "chdb", "values": [1268.329478, 1250.392767, 1229.038304], "boxplot": [1229.038304, 1229.038304, 1250.392767, 1268.329478, 1268.329478]}, {"adapter": "datafusion", "values": [717.799117, 714.064069, 687.72829], "boxplot": [687.72829, 687.72829, 714.064069, 717.799117, 717.799117]}, {"adapter": "duckdb", "values": [240.455789, 234.703648, 240.737222], "boxplot": [234.703648, 234.703648, 240.455789, 240.737222, 240.737222]}, {"adapter": "pandas", "values": [5017.472359, 5049.341722, 5036.570364], "boxplot": [5017.472359, 5017.472359, 5036.570364, 5049.341722, 5049.341722]}, {"adapter": "polars", "values": [367.867113, 344.224451, 346.188391], "boxplot": [344.224451, 344.224451, 346.188391, 367.867113, 367.867113]}, {"adapter": "questdb", "values": [4237.398723, 4245.178938, 4239.732024], "boxplot": [4237.398723, 4237.398723, 4239.732024, 4245.178938, 4245.178938]}, {"adapter": "rayforce", "values": [68.680871, 67.255766, 67.333512], "boxplot": [67.255766, 67.255766, 67.333512, 68.680871, 68.680871]}, {"adapter": "timescale", "values": [2226.101583, 2156.033235, 2180.926924], "boxplot": [2156.033235, 2156.033235, 2180.926924, 2226.101583, 2226.101583]}], "join_left": [{"adapter": "chdb", "values": [4225.68489, 4393.482494, 4120.886946], "boxplot": [4120.886946, 4120.886946, 4225.68489, 4393.482494, 4393.482494]}, {"adapter": "datafusion", "values": [813.664937, 798.857639, 827.319597], "boxplot": [798.857639, 798.857639, 813.664937, 827.319597, 827.319597]}, {"adapter": "duckdb", "values": [2013.606629, 2026.235215, 2035.802196], "boxplot": [2013.606629, 2013.606629, 2026.235215, 2035.802196, 2035.802196]}, {"adapter": "pandas", "values": [6216.491697, 6152.147788, 6210.174028], "boxplot": [6152.147788, 6152.147788, 6210.174028, 6216.491697, 6216.491697]}, {"adapter": "polars", "values": [687.331677, 619.143617, 641.749333], "boxplot": [619.143617, 619.143617, 641.749333, 687.331677, 687.331677]}, {"adapter": "questdb", "values": [14564.9725, 14489.188657, 14632.534854], "boxplot": [14489.188657, 14489.188657, 14564.9725, 14632.534854, 14632.534854]}, {"adapter": "rayforce", "values": [436.120515, 446.241231, 439.064739], "boxplot": [436.120515, 436.120515, 439.064739, 446.241231, 446.241231]}, {"adapter": "timescale", "values": [10424.640642, 10367.638121, 10426.827833], "boxplot": [10367.638121, 10367.638121, 10424.640642, 10426.827833, 10426.827833]}], "join_q1": [{"adapter": "chdb", "values": [3859.741547, 3700.174006, 3790.317239], "boxplot": [3700.174006, 3700.174006, 3790.317239, 3859.741547, 3859.741547]}, {"adapter": "datafusion", "values": [698.685422, 697.732627, 699.424265], "boxplot": [697.732627, 697.732627, 698.685422, 699.424265, 699.424265]}, {"adapter": "duckdb", "values": [1329.003731, 1371.014224, 1404.765956], "boxplot": [1329.003731, 1329.003731, 1371.014224, 1404.765956, 1404.765956]}, {"adapter": "pandas", "values": [1036.086833, 1112.333471, 1039.571785], "boxplot": [1036.086833, 1036.086833, 1039.571785, 1112.333471, 1112.333471]}, {"adapter": "polars", "values": [227.369517, 224.182743, 230.132473], "boxplot": [224.182743, 224.182743, 227.369517, 230.132473, 230.132473]}, {"adapter": "questdb", "values": [15667.619637, 15456.403114, 15356.54979], "boxplot": [15356.54979, 15356.54979, 15456.403114, 15667.619637, 15667.619637]}, {"adapter": "rayforce", "values": [139.766279, 139.626633, 136.525734], "boxplot": [136.525734, 136.525734, 139.626633, 139.766279, 139.766279]}, {"adapter": "timescale", "values": [11720.54785, 11656.566648, 11685.364106], "boxplot": [11656.566648, 11656.566648, 11685.364106, 11720.54785, 11720.54785]}], "join_q2": [{"adapter": "chdb", "values": [4333.404806, 4305.128683, 4335.124701], "boxplot": [4305.128683, 4305.128683, 4333.404806, 4335.124701, 4335.124701]}, {"adapter": "datafusion", "values": [732.07084, 696.903756, 689.879834], "boxplot": [689.879834, 689.879834, 696.903756, 732.07084, 732.07084]}, {"adapter": "duckdb", "values": [1599.759109, 1672.590104, 1637.421211], "boxplot": [1599.759109, 1599.759109, 1637.421211, 1672.590104, 1672.590104]}, {"adapter": "pandas", "values": [1334.793094, 1335.093131, 1330.213592], "boxplot": [1330.213592, 1330.213592, 1334.793094, 1335.093131, 1335.093131]}, {"adapter": "polars", "values": [334.100324, 332.310053, 319.804559], "boxplot": [319.804559, 319.804559, 332.310053, 334.100324, 334.100324]}, {"adapter": "questdb", "values": [18043.60118, 17924.925455, 17905.681355], "boxplot": [17905.681355, 17905.681355, 17924.925455, 18043.60118, 18043.60118]}, {"adapter": "rayforce", "values": [137.802286, 137.884081, 138.001466], "boxplot": [137.802286, 137.802286, 137.884081, 138.001466, 138.001466]}, {"adapter": "timescale", "values": [14118.411912, 13101.833465, 13117.115676], "boxplot": [13101.833465, 13101.833465, 13117.115676, 14118.411912, 14118.411912]}], "join_q3": [{"adapter": "chdb", "values": [4385.323614, 4309.707268, 4343.175706], "boxplot": [4309.707268, 4309.707268, 4343.175706, 4385.323614, 4385.323614]}, {"adapter": "datafusion", "values": [701.004051, 692.506079, 679.575104], "boxplot": [679.575104, 679.575104, 692.506079, 701.004051, 701.004051]}, {"adapter": "duckdb", "values": [1576.863896, 1488.87098, 1542.86457], "boxplot": [1488.87098, 1488.87098, 1542.86457, 1576.863896, 1576.863896]}, {"adapter": "pandas", "values": [742.940841, 904.488061, 751.5803], "boxplot": [742.940841, 742.940841, 751.5803, 904.488061, 904.488061]}, {"adapter": "polars", "values": [93.6474, 170.326369, 92.420101], "boxplot": [92.420101, 92.420101, 93.6474, 170.326369, 170.326369]}, {"adapter": "questdb", "values": [17768.090589, 18054.476508, 18074.217587], "boxplot": [17768.090589, 17768.090589, 18054.476508, 18074.217587, 18074.217587]}, {"adapter": "rayforce", "values": [127.99291, 127.8927, 127.496555], "boxplot": [127.496555, 127.496555, 127.8927, 127.99291, 127.99291]}, {"adapter": "timescale", "values": [12921.470955, 12923.243807, 13055.750353], "boxplot": [12921.470955, 12921.470955, 12923.243807, 13055.750353, 13055.750353]}], "join_q4": [{"adapter": "chdb", "values": [3988.218096, 4192.862688, 3987.114517], "boxplot": [3987.114517, 3987.114517, 3988.218096, 4192.862688, 4192.862688]}, {"adapter": "datafusion", "values": [711.157762, 697.640789, 686.268806], "boxplot": [686.268806, 686.268806, 697.640789, 711.157762, 711.157762]}, {"adapter": "duckdb", "values": [1391.284333, 1536.190408, 1522.447843], "boxplot": [1391.284333, 1391.284333, 1522.447843, 1536.190408, 1536.190408]}, {"adapter": "pandas", "values": [1545.522189, 1587.628757, 1577.257524], "boxplot": [1545.522189, 1545.522189, 1577.257524, 1587.628757, 1587.628757]}, {"adapter": "polars", "values": [365.746551, 469.305043, 471.597734], "boxplot": [365.746551, 365.746551, 469.305043, 471.597734, 471.597734]}, {"adapter": "questdb", "values": [18053.401985, 17864.984809, 17933.876613], "boxplot": [17864.984809, 17864.984809, 17933.876613, 18053.401985, 18053.401985]}, {"adapter": "rayforce", "values": [125.015594, 124.704141, 124.051939], "boxplot": [124.051939, 124.051939, 124.704141, 125.015594, 125.015594]}, {"adapter": "timescale", "values": [14211.103895, 13812.678675, 13876.999323], "boxplot": [13812.678675, 13812.678675, 13876.999323, 14211.103895, 14211.103895]}], "join_q5": [{"adapter": "chdb", "values": [5653.989488, 5801.309711, 5639.881957], "boxplot": [5639.881957, 5639.881957, 5653.989488, 5801.309711, 5801.309711]}, {"adapter": "datafusion", "values": [1170.396308, 1175.326223, 1170.202257], "boxplot": [1170.202257, 1170.202257, 1170.396308, 1175.326223, 1175.326223]}, {"adapter": "duckdb", "values": [2556.180977, 2180.211371, 2474.130783], "boxplot": [2180.211371, 2180.211371, 2474.130783, 2556.180977, 2556.180977]}, {"adapter": "pandas", "values": [7477.973602, 7524.296472, 7494.925995], "boxplot": [7477.973602, 7477.973602, 7494.925995, 7524.296472, 7524.296472]}, {"adapter": "polars", "values": [876.208715, 841.818671, 865.532423], "boxplot": [841.818671, 841.818671, 865.532423, 876.208715, 876.208715]}, {"adapter": "questdb", "values": [40168.715816, 40189.311438, 40835.013604], "boxplot": [40168.715816, 40168.715816, 40189.311438, 40835.013604, 40835.013604]}, {"adapter": "rayforce", "values": [317.918915, 314.945439, 316.303236], "boxplot": [314.945439, 314.945439, 316.303236, 317.918915, 317.918915]}, {"adapter": "timescale", "values": [26804.356056, 26007.561612, 26048.01391], "boxplot": [26007.561612, 26007.561612, 26048.01391, 26804.356056, 26804.356056]}], "sort_multi": [{"adapter": "chdb", "values": [5627.522778, 5769.391011, 5539.862483], "boxplot": [5539.862483, 5539.862483, 5627.522778, 5769.391011, 5769.391011]}, {"adapter": "datafusion", "values": [2099.87382, 2085.394963, 2094.198292], "boxplot": [2085.394963, 2085.394963, 2094.198292, 2099.87382, 2099.87382]}, {"adapter": "duckdb", "values": [5844.444768, 6019.749889, 5836.241452], "boxplot": [5836.241452, 5836.241452, 5844.444768, 6019.749889, 6019.749889]}, {"adapter": "pandas", "values": [8870.207739, 8956.919848, 8536.641854], "boxplot": [8536.641854, 8536.641854, 8870.207739, 8956.919848, 8956.919848]}, {"adapter": "polars", "values": [1929.284059, 1971.37774, 1839.395871], "boxplot": [1839.395871, 1839.395871, 1929.284059, 1971.37774, 1971.37774]}, {"adapter": "questdb", "values": [21314.318914, 21478.816214, 21468.560059], "boxplot": [21314.318914, 21314.318914, 21468.560059, 21478.816214, 21478.816214]}, {"adapter": "rayforce", "values": [258.873734, 258.418033, 258.755638], "boxplot": [258.418033, 258.418033, 258.755638, 258.873734, 258.873734]}, {"adapter": "timescale", "values": [21712.408413, 22296.467962, 22120.174409], "boxplot": [21712.408413, 21712.408413, 22120.174409, 22296.467962, 22296.467962]}], "sort_single": [{"adapter": "chdb", "values": [2431.082903, 2390.842804, 2332.272477], "boxplot": [2332.272477, 2332.272477, 2390.842804, 2431.082903, 2431.082903]}, {"adapter": "datafusion", "values": [1286.185314, 1263.511666, 1232.509941], "boxplot": [1232.509941, 1232.509941, 1263.511666, 1286.185314, 1286.185314]}, {"adapter": "duckdb", "values": [1802.66877, 1778.499478, 1828.361851], "boxplot": [1778.499478, 1778.499478, 1802.66877, 1828.361851, 1828.361851]}, {"adapter": "pandas", "values": [9103.882391, 10083.191178, 9536.816694], "boxplot": [9103.882391, 9103.882391, 9536.816694, 10083.191178, 10083.191178]}, {"adapter": "polars", "values": [574.412754, 565.545102, 559.373149], "boxplot": [559.373149, 559.373149, 565.545102, 574.412754, 574.412754]}, {"adapter": "questdb", "values": [17599.980769, 17787.792404, 17706.632356], "boxplot": [17599.980769, 17599.980769, 17706.632356, 17787.792404, 17787.792404]}, {"adapter": "rayforce", "values": [81.59528, 79.416197, 79.849295], "boxplot": [79.416197, 79.416197, 79.849295, 81.59528, 81.59528]}, {"adapter": "timescale", "values": [12756.82508, 12758.780267, 13378.647656], "boxplot": [12756.82508, 12756.82508, 12758.780267, 13378.647656, 13378.647656]}]}, "queries": {"groupby_q1": {"chdb": "SELECT id1, sum(v1) FROM data GROUP BY id1", "datafusion": "SELECT id1, sum(v1) FROM data GROUP BY id1", "duckdb": "SELECT id1, SUM(v1) FROM data GROUP BY id1", "pandas": "df.groupby(\"id1\", as_index=False)[\"v1\"].sum()", "polars": "df.group_by(\"id1\").agg(pl.sum(\"v1\"))", "questdb": "SELECT id1, SUM(v1) FROM data GROUP BY id1", "rayforce": "t.select(v1=Column(\"v1\").sum()).by(\"id1\").execute()", "timescale": "SELECT id1, SUM(v1) FROM data GROUP BY id1"}, "groupby_q2": {"chdb": "SELECT id1, id2, sum(v1) FROM data GROUP BY id1, id2", "datafusion": "SELECT id1, id2, sum(v1) FROM data GROUP BY id1, id2", "duckdb": "SELECT id1, id2, SUM(v1) FROM data GROUP BY id1, id2", "pandas": "df.groupby([\"id1\",\"id2\"], as_index=False)[\"v1\"].sum()", "polars": "df.group_by(\"id1\", \"id2\").agg(pl.sum(\"v1\"))", "questdb": "SELECT id1, id2, SUM(v1) FROM data GROUP BY id1, id2", "rayforce": "t.select(v1=Column(\"v1\").sum()).by(\"id1\",\"id2\").execute()", "timescale": "SELECT id1, id2, SUM(v1) FROM data GROUP BY id1, id2"}, "groupby_q3": {"chdb": "SELECT id3, sum(v1), avg(v3) FROM data GROUP BY id3", "datafusion": "SELECT id3, sum(v1), avg(v3) FROM data GROUP BY id3", "duckdb": "SELECT id3, SUM(v1), AVG(v3) FROM data GROUP BY id3", "pandas": "df.groupby(\"id3\", as_index=False).agg(v1=(\"v1\",\"sum\"), v3=(\"v3\",\"mean\"))", "polars": "df.group_by(\"id3\").agg(pl.sum(\"v1\"), pl.mean(\"v3\"))", "questdb": "SELECT id3, SUM(v1), AVG(v3) FROM data GROUP BY id3", "rayforce": "t.select(v1=Column(\"v1\").sum(), v3=Column(\"v3\").mean()).by(\"id3\").execute()", "timescale": "SELECT id3, SUM(v1), AVG(v3) FROM data GROUP BY id3"}, "groupby_q4": {"chdb": "SELECT id4, avg(v1), avg(v2), avg(v3) FROM data GROUP BY id4", "datafusion": "SELECT id4, avg(v1), avg(v2), avg(v3) FROM data GROUP BY id4", "duckdb": "SELECT id4, AVG(v1), AVG(v2), AVG(v3) FROM data GROUP BY id4", "pandas": "df.groupby(\"id4\", as_index=False).agg(v1=(\"v1\",\"mean\"), v2=(\"v2\",\"mean\"), v3=(\"v3\",\"mean\"))", "polars": "df.group_by(\"id4\").agg(pl.mean(\"v1\"), pl.mean(\"v2\"), pl.mean(\"v3\"))", "questdb": "SELECT id4, AVG(v1), AVG(v2), AVG(v3) FROM data GROUP BY id4", "rayforce": "t.select(v1=Column(\"v1\").mean(), v2=Column(\"v2\").mean(), v3=Column(\"v3\").mean()).by(\"id4\").execute()", "timescale": "SELECT id4, AVG(v1), AVG(v2), AVG(v3) FROM data GROUP BY id4"}, "groupby_q5": {"chdb": "SELECT id6, sum(v1), sum(v2), sum(v3) FROM data GROUP BY id6", "datafusion": "SELECT id6, sum(v1), sum(v2), sum(v3) FROM data GROUP BY id6", "duckdb": "SELECT id6, SUM(v1), SUM(v2), SUM(v3) FROM data GROUP BY id6", "pandas": "df.groupby(\"id6\", as_index=False).agg(v1=(\"v1\",\"sum\"), v2=(\"v2\",\"sum\"), v3=(\"v3\",\"sum\"))", "polars": "df.group_by(\"id6\").agg(pl.sum(\"v1\"), pl.sum(\"v2\"), pl.sum(\"v3\"))", "questdb": "SELECT id6, SUM(v1), SUM(v2), SUM(v3) FROM data GROUP BY id6", "rayforce": "t.select(v1=Column(\"v1\").sum(), v2=Column(\"v2\").sum(), v3=Column(\"v3\").sum()).by(\"id6\").execute()", "timescale": "SELECT id6, SUM(v1), SUM(v2), SUM(v3) FROM data GROUP BY id6"}, "groupby_q6": {"chdb": "SELECT id4, id5, median(v3), stddevSamp(v3) FROM data GROUP BY id4, id5", "datafusion": "SELECT id4, id5, median(v3), stddev(v3) FROM data GROUP BY id4, id5", "duckdb": "SELECT id4, id5, MEDIAN(v3), STDDEV(v3) FROM data GROUP BY id4, id5", "pandas": "df.groupby([\"id4\",\"id5\"], as_index=False).agg(v3_median=(\"v3\",\"median\"), v3_std=(\"v3\",\"std\"))", "polars": "df.group_by(\"id4\",\"id5\").agg(pl.median(\"v3\"), pl.std(\"v3\"))", "questdb": "-- NYI: QuestDB has no exact median(); only approx_median", "rayforce": "# NYI: rayforce engine does not support median + multi-key by()", "timescale": "SELECT id4, id5, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY v3), STDDEV_SAMP(v3) FROM data GROUP BY id4, id5"}, "groupby_q7": {"chdb": "SELECT id3, max(v1) - min(v2) FROM data GROUP BY id3", "datafusion": "SELECT id3, max(v1) - min(v2) FROM data GROUP BY id3", "duckdb": "SELECT id3, MAX(v1) - MIN(v2) FROM data GROUP BY id3", "pandas": "df.groupby(\"id3\", as_index=False).apply(lambda g: g[\"v1\"].max() - g[\"v2\"].min())", "polars": "df.group_by(\"id3\").agg((pl.max(\"v1\") - pl.min(\"v2\")).alias(\"range_v1_v2\"))", "questdb": "SELECT id3, MAX(v1) - MIN(v2) FROM data GROUP BY id3", "rayforce": "# Two-stage workaround for engine NYI on arithmetic-of-aggregates per-group:\nagg = t.select(v1m=Column(\"v1\").max(), v2m=Column(\"v2\").min()).by(\"id3\").execute()\nagg.select(\"id3\", range_v1_v2=Column(\"v1m\") - Column(\"v2m\")).execute()", "timescale": "SELECT id3, MAX(v1) - MIN(v2) FROM data GROUP BY id3"}, "groupby_q8": {"chdb": "SELECT id6, v3 FROM (SELECT id6, v3, row_number() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "datafusion": "SELECT id6, v3 FROM (SELECT id6, v3, ROW_NUMBER() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "duckdb": "SELECT id6, v3 FROM (SELECT id6, v3, ROW_NUMBER() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "pandas": "df.dropna(subset=[\"v3\"]).sort_values(\"v3\", ascending=False).groupby(\"id6\").head(2)", "polars": "df.drop_nulls(\"v3\").sort(\"v3\", descending=True).group_by(\"id6\").agg(pl.col(\"v3\").head(2).alias(\"largest2_v3\")).explode(\"largest2_v3\")", "questdb": "SELECT id6, v3 FROM (SELECT id6, v3, row_number() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "rayforce": "# NYI: rayforce-py has no top-N / per-group head(n)", "timescale": "SELECT id6, v3 FROM (SELECT id6, v3, ROW_NUMBER() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) sub WHERE rn <= 2"}, "groupby_q9": {"chdb": "SELECT id2, id4, pow(corr(v1, v2), 2) FROM data GROUP BY id2, id4", "datafusion": "SELECT id2, id4, POWER(corr(v1, v2), 2) FROM data GROUP BY id2, id4", "duckdb": "SELECT id2, id4, POWER(CORR(v1, v2), 2) FROM data GROUP BY id2, id4", "pandas": "df.groupby([\"id2\",\"id4\"]).apply(lambda g: g[\"v1\"].corr(g[\"v2\"]) ** 2)", "polars": "df.group_by(\"id2\",\"id4\").agg((pl.corr(\"v1\",\"v2\")**2).alias(\"r2\"))", "questdb": "SELECT id2, id4, POWER(corr(v1, v2), 2) FROM data GROUP BY id2, id4", "rayforce": "# NYI: rayforce-py has no Column.corr / pearson_corr", "timescale": "SELECT id2, id4, POWER(CORR(v1, v2), 2) FROM data GROUP BY id2, id4"}, "groupby_q10": {"chdb": "SELECT id1, id2, id3, id4, id5, id6, sum(v3), count(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "datafusion": "SELECT id1, id2, id3, id4, id5, id6, sum(v3), count(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "duckdb": "SELECT id1, id2, id3, id4, id5, id6, SUM(v3), COUNT(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "pandas": "df.groupby([\"id1\",\"id2\",\"id3\",\"id4\",\"id5\",\"id6\"], as_index=False).agg(v3=(\"v3\",\"sum\"), cnt=(\"v1\",\"count\"))", "polars": "df.group_by([\"id1\",\"id2\",\"id3\",\"id4\",\"id5\",\"id6\"]).agg(pl.sum(\"v3\"), pl.col(\"v1\").count().alias(\"cnt\"))", "questdb": "SELECT id1, id2, id3, id4, id5, id6, SUM(v3), COUNT(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "rayforce": "t.select(v3=Column(\"v3\").sum(), cnt=Column(\"v1\").count()).by(\"id1\",\"id2\",\"id3\",\"id4\",\"id5\",\"id6\").execute()", "timescale": "SELECT id1, id2, id3, id4, id5, id6, SUM(v3), COUNT(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6"}, "join_q1": {"chdb": "SELECT * FROM x INNER JOIN small USING (id1)", "datafusion": "SELECT * FROM x INNER JOIN small USING (id1)", "duckdb": "SELECT * FROM x INNER JOIN small USING (id1)", "pandas": "x.merge(small, on=\"id1\")", "polars": "x.join(small, on=\"id1\")", "questdb": "SELECT * FROM x INNER JOIN small ON x.id1 = small.id1", "rayforce": "# pre-project right to (key, v2) to avoid to_dict() collapse on dup cols\nx.inner_join(small.select(\"id1\",\"v2\").execute(), on=[\"id1\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN small USING (id1)"}, "join_q2": {"chdb": "SELECT * FROM x INNER JOIN medium USING (id2)", "datafusion": "SELECT * FROM x INNER JOIN medium USING (id2)", "duckdb": "SELECT * FROM x INNER JOIN medium USING (id2)", "pandas": "x.merge(medium, on=\"id2\")", "polars": "x.join(medium, on=\"id2\")", "questdb": "SELECT * FROM x INNER JOIN medium ON x.id2 = medium.id2", "rayforce": "x.inner_join(medium.select(\"id2\",\"v2\").execute(), on=[\"id2\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN medium USING (id2)"}, "join_q3": {"chdb": "SELECT * FROM x LEFT JOIN medium USING (id2)", "datafusion": "SELECT * FROM x LEFT JOIN medium USING (id2)", "duckdb": "SELECT * FROM x LEFT JOIN medium USING (id2)", "pandas": "x.merge(medium, on=\"id2\", how=\"left\")", "polars": "x.join(medium, on=\"id2\", how=\"left\")", "questdb": "SELECT * FROM x LEFT JOIN medium ON x.id2 = medium.id2", "rayforce": "x.left_join(medium.select(\"id2\",\"v2\").execute(), on=[\"id2\"]).execute()", "timescale": "SELECT * FROM x LEFT JOIN medium USING (id2)"}, "join_q4": {"chdb": "SELECT * FROM x INNER JOIN medium USING (id5)", "datafusion": "SELECT * FROM x INNER JOIN medium USING (id5)", "duckdb": "SELECT * FROM x INNER JOIN medium USING (id5)", "pandas": "x.merge(medium, on=\"id5\")", "polars": "x.join(medium, on=\"id5\")", "questdb": "SELECT * FROM x INNER JOIN medium ON x.id5 = medium.id5", "rayforce": "x.inner_join(medium.select(\"id5\",\"v2\").execute(), on=[\"id5\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN medium USING (id5)"}, "join_q5": {"chdb": "SELECT * FROM x INNER JOIN big USING (id3)", "datafusion": "SELECT * FROM x INNER JOIN big USING (id3)", "duckdb": "SELECT * FROM x INNER JOIN big USING (id3)", "pandas": "x.merge(big, on=\"id3\")", "polars": "x.join(big, on=\"id3\")", "questdb": "SELECT * FROM x INNER JOIN big ON x.id3 = big.id3", "rayforce": "x.inner_join(big.select(\"id3\",\"v2\").execute(), on=[\"id3\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN big USING (id3)"}, "join_inner": {"chdb": "SELECT * FROM left INNER JOIN right USING (id1, id2, id3)", "datafusion": "SELECT * FROM left INNER JOIN right USING (id1, id2, id3)", "duckdb": "SELECT * FROM left INNER JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "pandas": "left.merge(right, on=[\"id1\",\"id2\",\"id3\"], how=\"inner\")", "polars": "left.join(right, on=[\"id1\",\"id2\",\"id3\"], how=\"inner\")", "questdb": "SELECT * FROM left INNER JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "rayforce": "L.inner_join(R, on=[\"id1\",\"id2\",\"id3\"]).execute()", "timescale": "SELECT * FROM left INNER JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3"}, "join_left": {"chdb": "SELECT * FROM left LEFT JOIN right USING (id1, id2, id3)", "datafusion": "SELECT * FROM left LEFT JOIN right USING (id1, id2, id3)", "duckdb": "SELECT * FROM left LEFT JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "pandas": "left.merge(right, on=[\"id1\",\"id2\",\"id3\"], how=\"left\")", "polars": "left.join(right, on=[\"id1\",\"id2\",\"id3\"], how=\"left\")", "questdb": "SELECT * FROM left LEFT JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "rayforce": "L.left_join(R, on=[\"id1\",\"id2\",\"id3\"]).execute()", "timescale": "SELECT * FROM left LEFT JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3"}, "sort_single": {"chdb": "SELECT * FROM data ORDER BY id1", "datafusion": "SELECT * FROM data ORDER BY id1", "duckdb": "SELECT * FROM data ORDER BY id1", "pandas": "df.sort_values(\"id1\")", "polars": "df.sort(\"id1\")", "questdb": "SELECT * FROM data ORDER BY id1", "rayforce": "t.order_by(\"id1\").execute()", "timescale": "SELECT * FROM data ORDER BY id1"}, "sort_multi": {"chdb": "SELECT * FROM data ORDER BY id1, id2, id3", "datafusion": "SELECT * FROM data ORDER BY id1, id2, id3", "duckdb": "SELECT * FROM data ORDER BY id1, id2, id3", "pandas": "df.sort_values([\"id1\",\"id2\",\"id3\"])", "polars": "df.sort(\"id1\",\"id2\",\"id3\")", "questdb": "SELECT * FROM data ORDER BY id1, id2, id3", "rayforce": "t.order_by(\"id1\",\"id2\",\"id3\").execute()", "timescale": "SELECT * FROM data ORDER BY id1, id2, id3"}}}; +window.chartData = {"generated_at": "2026-05-17T10:18:12+03:00", "comparison": {"adapters": ["chdb", "datafusion", "duckdb", "pandas", "polars", "questdb", "rayforce", "timescale"], "tasks": ["groupby_q1", "groupby_q10", "groupby_q2", "groupby_q3", "groupby_q4", "groupby_q5", "groupby_q6", "groupby_q7", "groupby_q8", "groupby_q9", "join_inner", "join_left", "join_q1", "join_q2", "join_q3", "join_q4", "join_q5", "sort_multi", "sort_single"], "values": [{"adapter": "rayforce", "task": "groupby_q1", "median_ms": 6.971128}, {"adapter": "rayforce", "task": "groupby_q2", "median_ms": 17.370518}, {"adapter": "rayforce", "task": "groupby_q3", "median_ms": 37.959069}, {"adapter": "rayforce", "task": "groupby_q4", "median_ms": 11.93403}, {"adapter": "rayforce", "task": "groupby_q5", "median_ms": 62.402688}, {"adapter": "rayforce", "task": "groupby_q6", "median_ms": 75.30657}, {"adapter": "rayforce", "task": "groupby_q7", "median_ms": 59.033556}, {"adapter": "rayforce", "task": "groupby_q8", "median_ms": 43.989458}, {"adapter": "rayforce", "task": "groupby_q9", "median_ms": 67.840728}, {"adapter": "rayforce", "task": "groupby_q10", "median_ms": 170.703976}, {"adapter": "polars", "task": "groupby_q1", "median_ms": 31.00837}, {"adapter": "polars", "task": "groupby_q2", "median_ms": 223.737076}, {"adapter": "polars", "task": "groupby_q3", "median_ms": 271.057923}, {"adapter": "polars", "task": "groupby_q4", "median_ms": 29.21685}, {"adapter": "polars", "task": "groupby_q5", "median_ms": 175.504448}, {"adapter": "polars", "task": "groupby_q6", "median_ms": 236.048245}, {"adapter": "polars", "task": "groupby_q7", "median_ms": 277.398113}, {"adapter": "polars", "task": "groupby_q8", "median_ms": 495.63612}, {"adapter": "polars", "task": "groupby_q9", "median_ms": 431.610605}, {"adapter": "polars", "task": "groupby_q10", "median_ms": 2018.400285}, {"adapter": "duckdb", "task": "groupby_q1", "median_ms": 34.47726}, {"adapter": "duckdb", "task": "groupby_q2", "median_ms": 53.847835}, {"adapter": "duckdb", "task": "groupby_q3", "median_ms": 101.22585}, {"adapter": "duckdb", "task": "groupby_q4", "median_ms": 8.897053}, {"adapter": "duckdb", "task": "groupby_q5", "median_ms": 105.269338}, {"adapter": "duckdb", "task": "groupby_q6", "median_ms": 189.077741}, {"adapter": "duckdb", "task": "groupby_q7", "median_ms": 99.3353}, {"adapter": "duckdb", "task": "groupby_q8", "median_ms": 158.839282}, {"adapter": "duckdb", "task": "groupby_q9", "median_ms": 75.138824}, {"adapter": "duckdb", "task": "groupby_q10", "median_ms": 373.400973}, {"adapter": "chdb", "task": "groupby_q1", "median_ms": 30.309354}, {"adapter": "chdb", "task": "groupby_q2", "median_ms": 168.095397}, {"adapter": "chdb", "task": "groupby_q3", "median_ms": 216.618125}, {"adapter": "chdb", "task": "groupby_q4", "median_ms": 43.141467}, {"adapter": "chdb", "task": "groupby_q5", "median_ms": 177.327928}, {"adapter": "chdb", "task": "groupby_q6", "median_ms": 447.381146}, {"adapter": "chdb", "task": "groupby_q7", "median_ms": 217.702943}, {"adapter": "chdb", "task": "groupby_q8", "median_ms": 530.706351}, {"adapter": "chdb", "task": "groupby_q9", "median_ms": 198.329672}, {"adapter": "chdb", "task": "groupby_q10", "median_ms": 745.036899}, {"adapter": "datafusion", "task": "groupby_q1", "median_ms": 20.182904}, {"adapter": "datafusion", "task": "groupby_q2", "median_ms": 38.128968}, {"adapter": "datafusion", "task": "groupby_q3", "median_ms": 150.373084}, {"adapter": "datafusion", "task": "groupby_q4", "median_ms": 17.605885}, {"adapter": "datafusion", "task": "groupby_q5", "median_ms": 128.626816}, {"adapter": "datafusion", "task": "groupby_q6", "median_ms": 143.032423}, {"adapter": "datafusion", "task": "groupby_q7", "median_ms": 124.493897}, {"adapter": "datafusion", "task": "groupby_q8", "median_ms": 256.078106}, {"adapter": "datafusion", "task": "groupby_q9", "median_ms": 70.639973}, {"adapter": "datafusion", "task": "groupby_q10", "median_ms": 417.641037}, {"adapter": "pandas", "task": "groupby_q1", "median_ms": 229.841606}, {"adapter": "pandas", "task": "groupby_q2", "median_ms": 613.169059}, {"adapter": "pandas", "task": "groupby_q3", "median_ms": 850.615701}, {"adapter": "pandas", "task": "groupby_q4", "median_ms": 240.789596}, {"adapter": "pandas", "task": "groupby_q5", "median_ms": 398.761776}, {"adapter": "pandas", "task": "groupby_q6", "median_ms": 687.80712}, {"adapter": "pandas", "task": "groupby_q7", "median_ms": 852.80892}, {"adapter": "pandas", "task": "groupby_q8", "median_ms": 6856.271032}, {"adapter": "pandas", "task": "groupby_q9", "median_ms": 7354.730963}, {"adapter": "pandas", "task": "groupby_q10", "median_ms": 6915.796766}, {"adapter": "questdb", "task": "groupby_q1", "median_ms": 13.754442}, {"adapter": "questdb", "task": "groupby_q2", "median_ms": 54.615929}, {"adapter": "questdb", "task": "groupby_q3", "median_ms": 326.988248}, {"adapter": "questdb", "task": "groupby_q4", "median_ms": 37.296032}, {"adapter": "questdb", "task": "groupby_q5", "median_ms": 310.113192}, {"adapter": "questdb", "task": "groupby_q6", "median_ms": 0.0}, {"adapter": "questdb", "task": "groupby_q7", "median_ms": 221.769039}, {"adapter": "questdb", "task": "groupby_q8", "median_ms": 30534.313617}, {"adapter": "questdb", "task": "groupby_q9", "median_ms": 79.349774}, {"adapter": "questdb", "task": "groupby_q10", "median_ms": 5392.72611}, {"adapter": "timescale", "task": "groupby_q1", "median_ms": 457.907655}, {"adapter": "timescale", "task": "groupby_q2", "median_ms": 668.948013}, {"adapter": "timescale", "task": "groupby_q3", "median_ms": 1865.398248}, {"adapter": "timescale", "task": "groupby_q4", "median_ms": 448.068686}, {"adapter": "timescale", "task": "groupby_q5", "median_ms": 1652.03214}, {"adapter": "timescale", "task": "groupby_q6", "median_ms": 4253.313371}, {"adapter": "timescale", "task": "groupby_q7", "median_ms": 1225.879392}, {"adapter": "timescale", "task": "groupby_q8", "median_ms": 3368.934544}, {"adapter": "timescale", "task": "groupby_q9", "median_ms": 639.574708}, {"adapter": "timescale", "task": "groupby_q10", "median_ms": 23896.354027}, {"adapter": "rayforce", "task": "join_q1", "median_ms": 133.684225}, {"adapter": "rayforce", "task": "join_q2", "median_ms": 131.822446}, {"adapter": "rayforce", "task": "join_q3", "median_ms": 132.115353}, {"adapter": "rayforce", "task": "join_q4", "median_ms": 129.174564}, {"adapter": "rayforce", "task": "join_q5", "median_ms": 324.349827}, {"adapter": "polars", "task": "join_q1", "median_ms": 228.126112}, {"adapter": "polars", "task": "join_q2", "median_ms": 355.019194}, {"adapter": "polars", "task": "join_q3", "median_ms": 93.644997}, {"adapter": "polars", "task": "join_q4", "median_ms": 465.343039}, {"adapter": "polars", "task": "join_q5", "median_ms": 883.113051}, {"adapter": "duckdb", "task": "join_q1", "median_ms": 170.825968}, {"adapter": "duckdb", "task": "join_q2", "median_ms": 219.499909}, {"adapter": "duckdb", "task": "join_q3", "median_ms": 239.067777}, {"adapter": "duckdb", "task": "join_q4", "median_ms": 231.098126}, {"adapter": "duckdb", "task": "join_q5", "median_ms": 625.502572}, {"adapter": "chdb", "task": "join_q1", "median_ms": 133.41584}, {"adapter": "chdb", "task": "join_q2", "median_ms": 182.203326}, {"adapter": "chdb", "task": "join_q3", "median_ms": 177.654087}, {"adapter": "chdb", "task": "join_q4", "median_ms": 190.054905}, {"adapter": "chdb", "task": "join_q5", "median_ms": 1676.37437}, {"adapter": "datafusion", "task": "join_q1", "median_ms": 93.875846}, {"adapter": "datafusion", "task": "join_q2", "median_ms": 102.736336}, {"adapter": "datafusion", "task": "join_q3", "median_ms": 100.719203}, {"adapter": "datafusion", "task": "join_q4", "median_ms": 103.574957}, {"adapter": "datafusion", "task": "join_q5", "median_ms": 823.296592}, {"adapter": "pandas", "task": "join_q1", "median_ms": 1074.519474}, {"adapter": "pandas", "task": "join_q2", "median_ms": 1362.755713}, {"adapter": "pandas", "task": "join_q3", "median_ms": 765.282509}, {"adapter": "pandas", "task": "join_q4", "median_ms": 1613.520633}, {"adapter": "pandas", "task": "join_q5", "median_ms": 7558.863074}, {"adapter": "questdb", "task": "join_q1", "median_ms": 13020.719882}, {"adapter": "questdb", "task": "join_q2", "median_ms": 15536.930515}, {"adapter": "questdb", "task": "join_q3", "median_ms": 15685.713258}, {"adapter": "questdb", "task": "join_q4", "median_ms": 16032.972385}, {"adapter": "questdb", "task": "join_q5", "median_ms": 37404.923365}, {"adapter": "timescale", "task": "join_q1", "median_ms": 11657.483562}, {"adapter": "timescale", "task": "join_q2", "median_ms": 13493.257667}, {"adapter": "timescale", "task": "join_q3", "median_ms": 13311.392802}, {"adapter": "timescale", "task": "join_q4", "median_ms": 14279.013058}, {"adapter": "timescale", "task": "join_q5", "median_ms": 26488.992098}, {"adapter": "rayforce", "task": "join_inner", "median_ms": 68.658811}, {"adapter": "rayforce", "task": "join_left", "median_ms": 299.814965}, {"adapter": "polars", "task": "join_inner", "median_ms": 374.725466}, {"adapter": "polars", "task": "join_left", "median_ms": 675.882019}, {"adapter": "duckdb", "task": "join_inner", "median_ms": 273.3836}, {"adapter": "duckdb", "task": "join_left", "median_ms": 380.237764}, {"adapter": "chdb", "task": "join_inner", "median_ms": 1022.721439}, {"adapter": "chdb", "task": "join_left", "median_ms": 1085.583315}, {"adapter": "datafusion", "task": "join_inner", "median_ms": 570.69442}, {"adapter": "datafusion", "task": "join_left", "median_ms": 656.896961}, {"adapter": "pandas", "task": "join_inner", "median_ms": 5215.469562}, {"adapter": "pandas", "task": "join_left", "median_ms": 6309.372632}, {"adapter": "questdb", "task": "join_inner", "median_ms": 4136.601352}, {"adapter": "questdb", "task": "join_left", "median_ms": 13466.748286}, {"adapter": "timescale", "task": "join_inner", "median_ms": 15521.955667}, {"adapter": "timescale", "task": "join_left", "median_ms": 10590.248085}, {"adapter": "rayforce", "task": "sort_single", "median_ms": 86.990622}, {"adapter": "rayforce", "task": "sort_multi", "median_ms": 266.08366}, {"adapter": "polars", "task": "sort_single", "median_ms": 600.401362}, {"adapter": "polars", "task": "sort_multi", "median_ms": 1983.182276}, {"adapter": "duckdb", "task": "sort_single", "median_ms": 359.759423}, {"adapter": "duckdb", "task": "sort_multi", "median_ms": 1159.718102}, {"adapter": "chdb", "task": "sort_single", "median_ms": 546.844065}, {"adapter": "chdb", "task": "sort_multi", "median_ms": 5437.768278}, {"adapter": "datafusion", "task": "sort_single", "median_ms": 1040.708312}, {"adapter": "datafusion", "task": "sort_multi", "median_ms": 2229.318302}, {"adapter": "pandas", "task": "sort_single", "median_ms": 9571.246642}, {"adapter": "pandas", "task": "sort_multi", "median_ms": 8458.088126}, {"adapter": "questdb", "task": "sort_single", "median_ms": 16907.407046}, {"adapter": "questdb", "task": "sort_multi", "median_ms": 21165.373496}, {"adapter": "timescale", "task": "sort_single", "median_ms": 13092.980246}, {"adapter": "timescale", "task": "sort_multi", "median_ms": 22936.383768}]}, "tasks": {"groupby_q1": [{"adapter": "chdb", "values": [30.075177, 30.309354, 50.954611], "boxplot": [30.075177, 30.075177, 30.309354, 50.954611, 50.954611]}, {"adapter": "datafusion", "values": [15.606038, 20.182904, 21.68953], "boxplot": [15.606038, 15.606038, 20.182904, 21.68953, 21.68953]}, {"adapter": "duckdb", "values": [36.072355, 34.47726, 33.939814], "boxplot": [33.939814, 33.939814, 34.47726, 36.072355, 36.072355]}, {"adapter": "pandas", "values": [227.792444, 230.340678, 229.841606], "boxplot": [227.792444, 227.792444, 229.841606, 230.340678, 230.340678]}, {"adapter": "polars", "values": [31.377755, 30.769213, 31.00837], "boxplot": [30.769213, 30.769213, 31.00837, 31.377755, 31.377755]}, {"adapter": "questdb", "values": [16.679104, 13.754442, 12.100154], "boxplot": [12.100154, 12.100154, 13.754442, 16.679104, 16.679104]}, {"adapter": "rayforce", "values": [6.971128, 7.071989, 6.589428], "boxplot": [6.589428, 6.589428, 6.971128, 7.071989, 7.071989]}, {"adapter": "timescale", "values": [467.887003, 457.907655, 452.756672], "boxplot": [452.756672, 452.756672, 457.907655, 467.887003, 467.887003]}], "groupby_q10": [{"adapter": "chdb", "values": [745.036899, 706.385092, 771.160531], "boxplot": [706.385092, 706.385092, 745.036899, 771.160531, 771.160531]}, {"adapter": "datafusion", "values": [411.098489, 420.333586, 417.641037], "boxplot": [411.098489, 411.098489, 417.641037, 420.333586, 420.333586]}, {"adapter": "duckdb", "values": [371.334378, 373.668063, 373.400973], "boxplot": [371.334378, 371.334378, 373.400973, 373.668063, 373.668063]}, {"adapter": "pandas", "values": [6909.260175, 6915.796766, 6986.441074], "boxplot": [6909.260175, 6909.260175, 6915.796766, 6986.441074, 6986.441074]}, {"adapter": "polars", "values": [2018.400285, 2072.362224, 2018.337999], "boxplot": [2018.337999, 2018.337999, 2018.400285, 2072.362224, 2072.362224]}, {"adapter": "questdb", "values": [5657.313685, 5353.85678, 5392.72611], "boxplot": [5353.85678, 5353.85678, 5392.72611, 5657.313685, 5657.313685]}, {"adapter": "rayforce", "values": [175.923529, 170.703976, 169.565472], "boxplot": [169.565472, 169.565472, 170.703976, 175.923529, 175.923529]}, {"adapter": "timescale", "values": [23935.895926, 23870.166229, 23896.354027], "boxplot": [23870.166229, 23870.166229, 23896.354027, 23935.895926, 23935.895926]}], "groupby_q2": [{"adapter": "chdb", "values": [168.095397, 165.454256, 184.617995], "boxplot": [165.454256, 165.454256, 168.095397, 184.617995, 184.617995]}, {"adapter": "datafusion", "values": [38.128968, 37.157484, 38.326345], "boxplot": [37.157484, 37.157484, 38.128968, 38.326345, 38.326345]}, {"adapter": "duckdb", "values": [51.937208, 53.847835, 55.077853], "boxplot": [51.937208, 51.937208, 53.847835, 55.077853, 55.077853]}, {"adapter": "pandas", "values": [613.169059, 597.593189, 615.624144], "boxplot": [597.593189, 597.593189, 613.169059, 615.624144, 615.624144]}, {"adapter": "polars", "values": [218.895084, 232.082686, 223.737076], "boxplot": [218.895084, 218.895084, 223.737076, 232.082686, 232.082686]}, {"adapter": "questdb", "values": [219.460799, 54.615929, 41.511749], "boxplot": [41.511749, 41.511749, 54.615929, 219.460799, 219.460799]}, {"adapter": "rayforce", "values": [17.987205, 17.370518, 15.198452], "boxplot": [15.198452, 15.198452, 17.370518, 17.987205, 17.987205]}, {"adapter": "timescale", "values": [678.472903, 668.948013, 659.848184], "boxplot": [659.848184, 659.848184, 668.948013, 678.472903, 678.472903]}], "groupby_q3": [{"adapter": "chdb", "values": [217.093914, 216.618125, 204.097096], "boxplot": [204.097096, 204.097096, 216.618125, 217.093914, 217.093914]}, {"adapter": "datafusion", "values": [150.373084, 144.967276, 151.579897], "boxplot": [144.967276, 144.967276, 150.373084, 151.579897, 151.579897]}, {"adapter": "duckdb", "values": [101.22585, 99.330923, 102.358131], "boxplot": [99.330923, 99.330923, 101.22585, 102.358131, 102.358131]}, {"adapter": "pandas", "values": [850.615701, 903.071604, 828.636438], "boxplot": [828.636438, 828.636438, 850.615701, 903.071604, 903.071604]}, {"adapter": "polars", "values": [262.67921, 271.057923, 285.460926], "boxplot": [262.67921, 262.67921, 271.057923, 285.460926, 285.460926]}, {"adapter": "questdb", "values": [349.865451, 326.988248, 313.618922], "boxplot": [313.618922, 313.618922, 326.988248, 349.865451, 349.865451]}, {"adapter": "rayforce", "values": [40.409416, 37.455688, 37.959069], "boxplot": [37.455688, 37.455688, 37.959069, 40.409416, 40.409416]}, {"adapter": "timescale", "values": [1879.657053, 1865.398248, 1857.158022], "boxplot": [1857.158022, 1857.158022, 1865.398248, 1879.657053, 1879.657053]}], "groupby_q4": [{"adapter": "chdb", "values": [43.141467, 43.012581, 63.304444], "boxplot": [43.012581, 43.012581, 43.141467, 63.304444, 63.304444]}, {"adapter": "datafusion", "values": [15.416336, 17.605885, 19.100338], "boxplot": [15.416336, 15.416336, 17.605885, 19.100338, 19.100338]}, {"adapter": "duckdb", "values": [8.897053, 8.744982, 9.28855], "boxplot": [8.744982, 8.744982, 8.897053, 9.28855, 9.28855]}, {"adapter": "pandas", "values": [240.789596, 240.664026, 245.781364], "boxplot": [240.664026, 240.664026, 240.789596, 245.781364, 245.781364]}, {"adapter": "polars", "values": [29.21685, 29.146827, 29.258339], "boxplot": [29.146827, 29.146827, 29.21685, 29.258339, 29.258339]}, {"adapter": "questdb", "values": [48.458315, 37.278799, 37.296032], "boxplot": [37.278799, 37.278799, 37.296032, 48.458315, 48.458315]}, {"adapter": "rayforce", "values": [11.867614, 11.985178, 11.93403], "boxplot": [11.867614, 11.867614, 11.93403, 11.985178, 11.985178]}, {"adapter": "timescale", "values": [458.180315, 447.245804, 448.068686], "boxplot": [447.245804, 447.245804, 448.068686, 458.180315, 458.180315]}], "groupby_q5": [{"adapter": "chdb", "values": [177.327928, 181.547443, 156.327313], "boxplot": [156.327313, 156.327313, 177.327928, 181.547443, 181.547443]}, {"adapter": "datafusion", "values": [130.349835, 128.626816, 127.356921], "boxplot": [127.356921, 127.356921, 128.626816, 130.349835, 130.349835]}, {"adapter": "duckdb", "values": [105.269338, 105.815801, 102.233514], "boxplot": [102.233514, 102.233514, 105.269338, 105.815801, 105.815801]}, {"adapter": "pandas", "values": [398.761776, 379.284981, 415.15204], "boxplot": [379.284981, 379.284981, 398.761776, 415.15204, 415.15204]}, {"adapter": "polars", "values": [175.504448, 224.236257, 159.868681], "boxplot": [159.868681, 159.868681, 175.504448, 224.236257, 224.236257]}, {"adapter": "questdb", "values": [322.08493, 213.978937, 310.113192], "boxplot": [213.978937, 213.978937, 310.113192, 322.08493, 322.08493]}, {"adapter": "rayforce", "values": [65.203634, 61.975833, 62.402688], "boxplot": [61.975833, 61.975833, 62.402688, 65.203634, 65.203634]}, {"adapter": "timescale", "values": [1652.03214, 1679.963893, 1647.886553], "boxplot": [1647.886553, 1647.886553, 1652.03214, 1679.963893, 1679.963893]}], "groupby_q6": [{"adapter": "chdb", "values": [437.511256, 450.033679, 447.381146], "boxplot": [437.511256, 437.511256, 447.381146, 450.033679, 450.033679]}, {"adapter": "datafusion", "values": [139.685664, 143.032423, 151.995671], "boxplot": [139.685664, 139.685664, 143.032423, 151.995671, 151.995671]}, {"adapter": "duckdb", "values": [189.077741, 191.188379, 183.31979], "boxplot": [183.31979, 183.31979, 189.077741, 191.188379, 191.188379]}, {"adapter": "pandas", "values": [686.506148, 687.80712, 699.108641], "boxplot": [686.506148, 686.506148, 687.80712, 699.108641, 699.108641]}, {"adapter": "polars", "values": [236.048245, 228.458577, 237.111144], "boxplot": [228.458577, 228.458577, 236.048245, 237.111144, 237.111144]}, {"adapter": "questdb", "values": [], "boxplot": [0, 0, 0, 0, 0]}, {"adapter": "rayforce", "values": [73.930863, 75.389647, 75.30657], "boxplot": [73.930863, 73.930863, 75.30657, 75.389647, 75.389647]}, {"adapter": "timescale", "values": [4288.52214, 4253.313371, 4236.182459], "boxplot": [4236.182459, 4236.182459, 4253.313371, 4288.52214, 4288.52214]}], "groupby_q7": [{"adapter": "chdb", "values": [221.837696, 217.702943, 208.686864], "boxplot": [208.686864, 208.686864, 217.702943, 221.837696, 221.837696]}, {"adapter": "datafusion", "values": [122.917909, 124.493897, 126.632008], "boxplot": [122.917909, 122.917909, 124.493897, 126.632008, 126.632008]}, {"adapter": "duckdb", "values": [99.349377, 99.3353, 95.959096], "boxplot": [95.959096, 95.959096, 99.3353, 99.349377, 99.349377]}, {"adapter": "pandas", "values": [851.208556, 857.957758, 852.80892], "boxplot": [851.208556, 851.208556, 852.80892, 857.957758, 857.957758]}, {"adapter": "polars", "values": [267.884624, 282.319928, 277.398113], "boxplot": [267.884624, 267.884624, 277.398113, 282.319928, 282.319928]}, {"adapter": "questdb", "values": [206.141584, 223.81294, 221.769039], "boxplot": [206.141584, 206.141584, 221.769039, 223.81294, 223.81294]}, {"adapter": "rayforce", "values": [58.311829, 59.033556, 60.133716], "boxplot": [58.311829, 58.311829, 59.033556, 60.133716, 60.133716]}, {"adapter": "timescale", "values": [1252.793364, 1221.843517, 1225.879392], "boxplot": [1221.843517, 1221.843517, 1225.879392, 1252.793364, 1252.793364]}], "groupby_q8": [{"adapter": "chdb", "values": [530.706351, 533.881561, 514.983689], "boxplot": [514.983689, 514.983689, 530.706351, 533.881561, 533.881561]}, {"adapter": "datafusion", "values": [256.078106, 251.851259, 256.674865], "boxplot": [251.851259, 251.851259, 256.078106, 256.674865, 256.674865]}, {"adapter": "duckdb", "values": [159.704022, 152.659655, 158.839282], "boxplot": [152.659655, 152.659655, 158.839282, 159.704022, 159.704022]}, {"adapter": "pandas", "values": [6705.634094, 6856.271032, 7154.09041], "boxplot": [6705.634094, 6705.634094, 6856.271032, 7154.09041, 7154.09041]}, {"adapter": "polars", "values": [487.55772, 508.673446, 495.63612], "boxplot": [487.55772, 487.55772, 495.63612, 508.673446, 508.673446]}, {"adapter": "questdb", "values": [30668.65717, 30512.405445, 30534.313617], "boxplot": [30512.405445, 30512.405445, 30534.313617, 30668.65717, 30668.65717]}, {"adapter": "rayforce", "values": [42.598564, 43.989458, 45.054301], "boxplot": [42.598564, 42.598564, 43.989458, 45.054301, 45.054301]}, {"adapter": "timescale", "values": [3368.934544, 3345.686203, 3404.845627], "boxplot": [3345.686203, 3345.686203, 3368.934544, 3404.845627, 3404.845627]}], "groupby_q9": [{"adapter": "chdb", "values": [187.950571, 198.329672, 201.627086], "boxplot": [187.950571, 187.950571, 198.329672, 201.627086, 201.627086]}, {"adapter": "datafusion", "values": [70.639973, 71.333717, 70.275789], "boxplot": [70.275789, 70.275789, 70.639973, 71.333717, 71.333717]}, {"adapter": "duckdb", "values": [73.456563, 75.138824, 77.146807], "boxplot": [73.456563, 73.456563, 75.138824, 77.146807, 77.146807]}, {"adapter": "pandas", "values": [7768.392966, 7239.147004, 7354.730963], "boxplot": [7239.147004, 7239.147004, 7354.730963, 7768.392966, 7768.392966]}, {"adapter": "polars", "values": [431.610605, 413.220402, 476.713528], "boxplot": [413.220402, 413.220402, 431.610605, 476.713528, 476.713528]}, {"adapter": "questdb", "values": [102.711411, 79.349774, 72.880712], "boxplot": [72.880712, 72.880712, 79.349774, 102.711411, 102.711411]}, {"adapter": "rayforce", "values": [66.571675, 68.239047, 67.840728], "boxplot": [66.571675, 66.571675, 67.840728, 68.239047, 68.239047]}, {"adapter": "timescale", "values": [655.428382, 639.574708, 637.106492], "boxplot": [637.106492, 637.106492, 639.574708, 655.428382, 655.428382]}], "join_inner": [{"adapter": "chdb", "values": [1012.274315, 1022.721439, 1023.721092], "boxplot": [1012.274315, 1012.274315, 1022.721439, 1023.721092, 1023.721092]}, {"adapter": "datafusion", "values": [565.558953, 570.69442, 571.91576], "boxplot": [565.558953, 565.558953, 570.69442, 571.91576, 571.91576]}, {"adapter": "duckdb", "values": [280.24663, 273.37293, 273.3836], "boxplot": [273.37293, 273.37293, 273.3836, 280.24663, 280.24663]}, {"adapter": "pandas", "values": [5339.891511, 5128.620853, 5215.469562], "boxplot": [5128.620853, 5128.620853, 5215.469562, 5339.891511, 5339.891511]}, {"adapter": "polars", "values": [374.725466, 365.235395, 394.558755], "boxplot": [365.235395, 365.235395, 374.725466, 394.558755, 394.558755]}, {"adapter": "questdb", "values": [4182.294226, 4136.601352, 4135.077011], "boxplot": [4135.077011, 4135.077011, 4136.601352, 4182.294226, 4182.294226]}, {"adapter": "rayforce", "values": [68.658811, 67.90306, 68.826462], "boxplot": [67.90306, 67.90306, 68.658811, 68.826462, 68.826462]}, {"adapter": "timescale", "values": [15377.734909, 15521.955667, 15950.793847], "boxplot": [15377.734909, 15377.734909, 15521.955667, 15950.793847, 15950.793847]}], "join_left": [{"adapter": "chdb", "values": [1113.352088, 1036.152512, 1085.583315], "boxplot": [1036.152512, 1036.152512, 1085.583315, 1113.352088, 1113.352088]}, {"adapter": "datafusion", "values": [656.896961, 676.332523, 655.575121], "boxplot": [655.575121, 655.575121, 656.896961, 676.332523, 676.332523]}, {"adapter": "duckdb", "values": [381.433935, 367.134521, 380.237764], "boxplot": [367.134521, 367.134521, 380.237764, 381.433935, 381.433935]}, {"adapter": "pandas", "values": [6340.149809, 6260.063872, 6309.372632], "boxplot": [6260.063872, 6260.063872, 6309.372632, 6340.149809, 6340.149809]}, {"adapter": "polars", "values": [644.500853, 675.882019, 681.652517], "boxplot": [644.500853, 644.500853, 675.882019, 681.652517, 681.652517]}, {"adapter": "questdb", "values": [13470.445384, 13441.824417, 13466.748286], "boxplot": [13441.824417, 13441.824417, 13466.748286, 13470.445384, 13470.445384]}, {"adapter": "rayforce", "values": [297.712671, 301.052773, 299.814965], "boxplot": [297.712671, 297.712671, 299.814965, 301.052773, 301.052773]}, {"adapter": "timescale", "values": [10489.896538, 10590.248085, 10695.033558], "boxplot": [10489.896538, 10489.896538, 10590.248085, 10695.033558, 10695.033558]}], "join_q1": [{"adapter": "chdb", "values": [132.321029, 136.279789, 133.41584], "boxplot": [132.321029, 132.321029, 133.41584, 136.279789, 136.279789]}, {"adapter": "datafusion", "values": [93.875846, 97.435884, 85.401553], "boxplot": [85.401553, 85.401553, 93.875846, 97.435884, 97.435884]}, {"adapter": "duckdb", "values": [174.231893, 170.487822, 170.825968], "boxplot": [170.487822, 170.487822, 170.825968, 174.231893, 174.231893]}, {"adapter": "pandas", "values": [1074.519474, 1158.54836, 1064.291479], "boxplot": [1064.291479, 1064.291479, 1074.519474, 1158.54836, 1158.54836]}, {"adapter": "polars", "values": [226.702083, 231.724324, 228.126112], "boxplot": [226.702083, 226.702083, 228.126112, 231.724324, 231.724324]}, {"adapter": "questdb", "values": [13365.261045, 13020.719882, 12894.61415], "boxplot": [12894.61415, 12894.61415, 13020.719882, 13365.261045, 13365.261045]}, {"adapter": "rayforce", "values": [134.642645, 133.451501, 133.684225], "boxplot": [133.451501, 133.451501, 133.684225, 134.642645, 134.642645]}, {"adapter": "timescale", "values": [11657.483562, 11589.247094, 11705.787975], "boxplot": [11589.247094, 11589.247094, 11657.483562, 11705.787975, 11705.787975]}], "join_q2": [{"adapter": "chdb", "values": [174.450571, 182.203326, 190.579712], "boxplot": [174.450571, 174.450571, 182.203326, 190.579712, 190.579712]}, {"adapter": "datafusion", "values": [110.545288, 102.736336, 88.390331], "boxplot": [88.390331, 88.390331, 102.736336, 110.545288, 110.545288]}, {"adapter": "duckdb", "values": [228.309594, 215.213534, 219.499909], "boxplot": [215.213534, 215.213534, 219.499909, 228.309594, 228.309594]}, {"adapter": "pandas", "values": [1362.755713, 1351.968743, 1384.425707], "boxplot": [1351.968743, 1351.968743, 1362.755713, 1384.425707, 1384.425707]}, {"adapter": "polars", "values": [339.877397, 366.209815, 355.019194], "boxplot": [339.877397, 339.877397, 355.019194, 366.209815, 366.209815]}, {"adapter": "questdb", "values": [15549.497765, 15536.930515, 15482.004985], "boxplot": [15482.004985, 15482.004985, 15536.930515, 15549.497765, 15549.497765]}, {"adapter": "rayforce", "values": [130.954589, 133.274449, 131.822446], "boxplot": [130.954589, 130.954589, 131.822446, 133.274449, 133.274449]}, {"adapter": "timescale", "values": [13480.314015, 13493.257667, 13493.746764], "boxplot": [13480.314015, 13480.314015, 13493.257667, 13493.746764, 13493.746764]}], "join_q3": [{"adapter": "chdb", "values": [177.654087, 171.75997, 180.547482], "boxplot": [171.75997, 171.75997, 177.654087, 180.547482, 180.547482]}, {"adapter": "datafusion", "values": [95.971798, 100.719203, 109.795626], "boxplot": [95.971798, 95.971798, 100.719203, 109.795626, 109.795626]}, {"adapter": "duckdb", "values": [246.458491, 237.620904, 239.067777], "boxplot": [237.620904, 237.620904, 239.067777, 246.458491, 246.458491]}, {"adapter": "pandas", "values": [760.462016, 923.323884, 765.282509], "boxplot": [760.462016, 760.462016, 765.282509, 923.323884, 923.323884]}, {"adapter": "polars", "values": [89.357709, 177.199253, 93.644997], "boxplot": [89.357709, 89.357709, 93.644997, 177.199253, 177.199253]}, {"adapter": "questdb", "values": [15857.665631, 15685.713258, 15372.128884], "boxplot": [15372.128884, 15372.128884, 15685.713258, 15857.665631, 15857.665631]}, {"adapter": "rayforce", "values": [132.115353, 131.093712, 132.578748], "boxplot": [131.093712, 131.093712, 132.115353, 132.578748, 132.578748]}, {"adapter": "timescale", "values": [14085.72108, 13311.392802, 13165.720948], "boxplot": [13165.720948, 13165.720948, 13311.392802, 14085.72108, 14085.72108]}], "join_q4": [{"adapter": "chdb", "values": [188.298141, 190.054905, 202.381915], "boxplot": [188.298141, 188.298141, 190.054905, 202.381915, 202.381915]}, {"adapter": "datafusion", "values": [98.708935, 103.574957, 108.005767], "boxplot": [98.708935, 98.708935, 103.574957, 108.005767, 108.005767]}, {"adapter": "duckdb", "values": [226.928453, 234.846354, 231.098126], "boxplot": [226.928453, 226.928453, 231.098126, 234.846354, 234.846354]}, {"adapter": "pandas", "values": [1580.391056, 1613.520633, 1623.014567], "boxplot": [1580.391056, 1580.391056, 1613.520633, 1623.014567, 1623.014567]}, {"adapter": "polars", "values": [485.287317, 465.343039, 461.885906], "boxplot": [461.885906, 461.885906, 465.343039, 485.287317, 485.287317]}, {"adapter": "questdb", "values": [16414.656882, 16032.972385, 15993.333055], "boxplot": [15993.333055, 15993.333055, 16032.972385, 16414.656882, 16414.656882]}, {"adapter": "rayforce", "values": [128.442776, 129.174564, 135.760011], "boxplot": [128.442776, 128.442776, 129.174564, 135.760011, 135.760011]}, {"adapter": "timescale", "values": [14279.013058, 14272.05577, 14396.924957], "boxplot": [14272.05577, 14272.05577, 14279.013058, 14396.924957, 14396.924957]}], "join_q5": [{"adapter": "chdb", "values": [1769.310978, 1676.37437, 1658.92861], "boxplot": [1658.92861, 1658.92861, 1676.37437, 1769.310978, 1769.310978]}, {"adapter": "datafusion", "values": [814.229999, 823.296592, 837.814985], "boxplot": [814.229999, 814.229999, 823.296592, 837.814985, 837.814985]}, {"adapter": "duckdb", "values": [625.502572, 633.510744, 606.074179], "boxplot": [606.074179, 606.074179, 625.502572, 633.510744, 633.510744]}, {"adapter": "pandas", "values": [7497.027246, 7558.863074, 7678.428811], "boxplot": [7497.027246, 7497.027246, 7558.863074, 7678.428811, 7678.428811]}, {"adapter": "polars", "values": [883.113051, 871.452791, 893.866463], "boxplot": [871.452791, 871.452791, 883.113051, 893.866463, 893.866463]}, {"adapter": "questdb", "values": [36976.122859, 37404.923365, 37507.763661], "boxplot": [36976.122859, 36976.122859, 37404.923365, 37507.763661, 37507.763661]}, {"adapter": "rayforce", "values": [324.349827, 329.414139, 323.380025], "boxplot": [323.380025, 323.380025, 324.349827, 329.414139, 329.414139]}, {"adapter": "timescale", "values": [27650.273433, 26488.992098, 25996.828063], "boxplot": [25996.828063, 25996.828063, 26488.992098, 27650.273433, 27650.273433]}], "sort_multi": [{"adapter": "chdb", "values": [5437.768278, 5407.47953, 5529.024596], "boxplot": [5407.47953, 5407.47953, 5437.768278, 5529.024596, 5529.024596]}, {"adapter": "datafusion", "values": [2119.790408, 2229.318302, 2318.703137], "boxplot": [2119.790408, 2119.790408, 2229.318302, 2318.703137, 2318.703137]}, {"adapter": "duckdb", "values": [1177.61354, 1159.718102, 1143.129957], "boxplot": [1143.129957, 1143.129957, 1159.718102, 1177.61354, 1177.61354]}, {"adapter": "pandas", "values": [9027.167991, 8341.50787, 8458.088126], "boxplot": [8341.50787, 8341.50787, 8458.088126, 9027.167991, 9027.167991]}, {"adapter": "polars", "values": [2078.115573, 1983.182276, 1960.174071], "boxplot": [1960.174071, 1960.174071, 1983.182276, 2078.115573, 2078.115573]}, {"adapter": "questdb", "values": [20812.126651, 21165.373496, 21178.815081], "boxplot": [20812.126651, 20812.126651, 21165.373496, 21178.815081, 21178.815081]}, {"adapter": "rayforce", "values": [266.08366, 266.632949, 264.067293], "boxplot": [264.067293, 264.067293, 266.08366, 266.632949, 266.632949]}, {"adapter": "timescale", "values": [22936.383768, 23422.355385, 22809.6371], "boxplot": [22809.6371, 22809.6371, 22936.383768, 23422.355385, 23422.355385]}], "sort_single": [{"adapter": "chdb", "values": [569.424375, 546.844065, 537.208057], "boxplot": [537.208057, 537.208057, 546.844065, 569.424375, 569.424375]}, {"adapter": "datafusion", "values": [1040.708312, 1039.608403, 1132.460303], "boxplot": [1039.608403, 1039.608403, 1040.708312, 1132.460303, 1132.460303]}, {"adapter": "duckdb", "values": [359.759423, 365.860585, 346.242137], "boxplot": [346.242137, 346.242137, 359.759423, 365.860585, 365.860585]}, {"adapter": "pandas", "values": [9571.246642, 9310.505637, 9633.060745], "boxplot": [9310.505637, 9310.505637, 9571.246642, 9633.060745, 9633.060745]}, {"adapter": "polars", "values": [712.479347, 600.401362, 594.931644], "boxplot": [594.931644, 594.931644, 600.401362, 712.479347, 712.479347]}, {"adapter": "questdb", "values": [17023.903595, 16907.407046, 16624.047288], "boxplot": [16624.047288, 16624.047288, 16907.407046, 17023.903595, 17023.903595]}, {"adapter": "rayforce", "values": [86.990622, 87.386538, 86.490287], "boxplot": [86.490287, 86.490287, 86.990622, 87.386538, 87.386538]}, {"adapter": "timescale", "values": [13148.022207, 13092.980246, 12942.124823], "boxplot": [12942.124823, 12942.124823, 13092.980246, 13148.022207, 13148.022207]}]}, "queries": {"groupby_q1": {"chdb": "SELECT id1, sum(v1) FROM data GROUP BY id1", "datafusion": "SELECT id1, sum(v1) FROM data GROUP BY id1", "duckdb": "SELECT id1, SUM(v1) FROM data GROUP BY id1", "pandas": "df.groupby(\"id1\", as_index=False)[\"v1\"].sum()", "polars": "df.group_by(\"id1\").agg(pl.sum(\"v1\"))", "questdb": "SELECT id1, SUM(v1) FROM data GROUP BY id1", "rayforce": "t.select(v1=Column(\"v1\").sum()).by(\"id1\").execute()", "timescale": "SELECT id1, SUM(v1) FROM data GROUP BY id1"}, "groupby_q2": {"chdb": "SELECT id1, id2, sum(v1) FROM data GROUP BY id1, id2", "datafusion": "SELECT id1, id2, sum(v1) FROM data GROUP BY id1, id2", "duckdb": "SELECT id1, id2, SUM(v1) FROM data GROUP BY id1, id2", "pandas": "df.groupby([\"id1\",\"id2\"], as_index=False)[\"v1\"].sum()", "polars": "df.group_by(\"id1\", \"id2\").agg(pl.sum(\"v1\"))", "questdb": "SELECT id1, id2, SUM(v1) FROM data GROUP BY id1, id2", "rayforce": "t.select(v1=Column(\"v1\").sum()).by(\"id1\",\"id2\").execute()", "timescale": "SELECT id1, id2, SUM(v1) FROM data GROUP BY id1, id2"}, "groupby_q3": {"chdb": "SELECT id3, sum(v1), avg(v3) FROM data GROUP BY id3", "datafusion": "SELECT id3, sum(v1), avg(v3) FROM data GROUP BY id3", "duckdb": "SELECT id3, SUM(v1), AVG(v3) FROM data GROUP BY id3", "pandas": "df.groupby(\"id3\", as_index=False).agg(v1=(\"v1\",\"sum\"), v3=(\"v3\",\"mean\"))", "polars": "df.group_by(\"id3\").agg(pl.sum(\"v1\"), pl.mean(\"v3\"))", "questdb": "SELECT id3, SUM(v1), AVG(v3) FROM data GROUP BY id3", "rayforce": "t.select(v1=Column(\"v1\").sum(), v3=Column(\"v3\").mean()).by(\"id3\").execute()", "timescale": "SELECT id3, SUM(v1), AVG(v3) FROM data GROUP BY id3"}, "groupby_q4": {"chdb": "SELECT id4, avg(v1), avg(v2), avg(v3) FROM data GROUP BY id4", "datafusion": "SELECT id4, avg(v1), avg(v2), avg(v3) FROM data GROUP BY id4", "duckdb": "SELECT id4, AVG(v1), AVG(v2), AVG(v3) FROM data GROUP BY id4", "pandas": "df.groupby(\"id4\", as_index=False).agg(v1=(\"v1\",\"mean\"), v2=(\"v2\",\"mean\"), v3=(\"v3\",\"mean\"))", "polars": "df.group_by(\"id4\").agg(pl.mean(\"v1\"), pl.mean(\"v2\"), pl.mean(\"v3\"))", "questdb": "SELECT id4, AVG(v1), AVG(v2), AVG(v3) FROM data GROUP BY id4", "rayforce": "t.select(v1=Column(\"v1\").mean(), v2=Column(\"v2\").mean(), v3=Column(\"v3\").mean()).by(\"id4\").execute()", "timescale": "SELECT id4, AVG(v1), AVG(v2), AVG(v3) FROM data GROUP BY id4"}, "groupby_q5": {"chdb": "SELECT id6, sum(v1), sum(v2), sum(v3) FROM data GROUP BY id6", "datafusion": "SELECT id6, sum(v1), sum(v2), sum(v3) FROM data GROUP BY id6", "duckdb": "SELECT id6, SUM(v1), SUM(v2), SUM(v3) FROM data GROUP BY id6", "pandas": "df.groupby(\"id6\", as_index=False).agg(v1=(\"v1\",\"sum\"), v2=(\"v2\",\"sum\"), v3=(\"v3\",\"sum\"))", "polars": "df.group_by(\"id6\").agg(pl.sum(\"v1\"), pl.sum(\"v2\"), pl.sum(\"v3\"))", "questdb": "SELECT id6, SUM(v1), SUM(v2), SUM(v3) FROM data GROUP BY id6", "rayforce": "t.select(v1=Column(\"v1\").sum(), v2=Column(\"v2\").sum(), v3=Column(\"v3\").sum()).by(\"id6\").execute()", "timescale": "SELECT id6, SUM(v1), SUM(v2), SUM(v3) FROM data GROUP BY id6"}, "groupby_q6": {"chdb": "SELECT id4, id5, median(v3), stddevSamp(v3) FROM data GROUP BY id4, id5", "datafusion": "SELECT id4, id5, median(v3), stddev(v3) FROM data GROUP BY id4, id5", "duckdb": "SELECT id4, id5, MEDIAN(v3), STDDEV(v3) FROM data GROUP BY id4, id5", "pandas": "df.groupby([\"id4\",\"id5\"], as_index=False).agg(v3_median=(\"v3\",\"median\"), v3_std=(\"v3\",\"std\"))", "polars": "df.group_by(\"id4\",\"id5\").agg(pl.median(\"v3\"), pl.std(\"v3\"))", "questdb": "-- NYI: QuestDB has no exact median(); only approx_median", "rayforce": "t.select(v3_median=Column(\"v3\").median(), v3_std=Column(\"v3\").std()).by(\"id4\",\"id5\").execute()", "timescale": "SELECT id4, id5, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY v3), STDDEV_SAMP(v3) FROM data GROUP BY id4, id5"}, "groupby_q7": {"chdb": "SELECT id3, max(v1) - min(v2) FROM data GROUP BY id3", "datafusion": "SELECT id3, max(v1) - min(v2) FROM data GROUP BY id3", "duckdb": "SELECT id3, MAX(v1) - MIN(v2) FROM data GROUP BY id3", "pandas": "df.groupby(\"id3\", as_index=False).apply(lambda g: g[\"v1\"].max() - g[\"v2\"].min())", "polars": "df.group_by(\"id3\").agg((pl.max(\"v1\") - pl.min(\"v2\")).alias(\"range_v1_v2\"))", "questdb": "SELECT id3, MAX(v1) - MIN(v2) FROM data GROUP BY id3", "rayforce": "# Two-stage workaround for engine NYI on arithmetic-of-aggregates per-group:\nagg = t.select(v1m=Column(\"v1\").max(), v2m=Column(\"v2\").min()).by(\"id3\").execute()\nagg.select(\"id3\", range_v1_v2=Column(\"v1m\") - Column(\"v2m\")).execute()", "timescale": "SELECT id3, MAX(v1) - MIN(v2) FROM data GROUP BY id3"}, "groupby_q8": {"chdb": "SELECT id6, v3 FROM (SELECT id6, v3, row_number() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "datafusion": "SELECT id6, v3 FROM (SELECT id6, v3, ROW_NUMBER() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "duckdb": "SELECT id6, v3 FROM (SELECT id6, v3, ROW_NUMBER() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "pandas": "df.dropna(subset=[\"v3\"]).sort_values(\"v3\", ascending=False).groupby(\"id6\").head(2)", "polars": "df.drop_nulls(\"v3\").sort(\"v3\", descending=True).group_by(\"id6\").agg(pl.col(\"v3\").head(2).alias(\"largest2_v3\")).explode(\"largest2_v3\")", "questdb": "SELECT id6, v3 FROM (SELECT id6, v3, row_number() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", "rayforce": "t.select(largest2_v3=Column(\"v3\").top(2)).by(\"id6\").execute()", "timescale": "SELECT id6, v3 FROM (SELECT id6, v3, ROW_NUMBER() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) sub WHERE rn <= 2"}, "groupby_q9": {"chdb": "SELECT id2, id4, pow(corr(v1, v2), 2) FROM data GROUP BY id2, id4", "datafusion": "SELECT id2, id4, POWER(corr(v1, v2), 2) FROM data GROUP BY id2, id4", "duckdb": "SELECT id2, id4, POWER(CORR(v1, v2), 2) FROM data GROUP BY id2, id4", "pandas": "df.groupby([\"id2\",\"id4\"]).apply(lambda g: g[\"v1\"].corr(g[\"v2\"]) ** 2)", "polars": "df.group_by(\"id2\",\"id4\").agg((pl.corr(\"v1\",\"v2\")**2).alias(\"r2\"))", "questdb": "SELECT id2, id4, POWER(corr(v1, v2), 2) FROM data GROUP BY id2, id4", "rayforce": "# Two-stage: pearson_corr at top first, then square the result\nagg = t.select(r=Column(\"v1\").pearson_corr(Column(\"v2\"))).by(\"id2\",\"id4\").execute()\nagg.select(\"id2\", \"id4\", r2=Column(\"r\")*Column(\"r\")).execute()", "timescale": "SELECT id2, id4, POWER(CORR(v1, v2), 2) FROM data GROUP BY id2, id4"}, "groupby_q10": {"chdb": "SELECT id1, id2, id3, id4, id5, id6, sum(v3), count(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "datafusion": "SELECT id1, id2, id3, id4, id5, id6, sum(v3), count(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "duckdb": "SELECT id1, id2, id3, id4, id5, id6, SUM(v3), COUNT(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "pandas": "df.groupby([\"id1\",\"id2\",\"id3\",\"id4\",\"id5\",\"id6\"], as_index=False).agg(v3=(\"v3\",\"sum\"), cnt=(\"v1\",\"count\"))", "polars": "df.group_by([\"id1\",\"id2\",\"id3\",\"id4\",\"id5\",\"id6\"]).agg(pl.sum(\"v3\"), pl.col(\"v1\").count().alias(\"cnt\"))", "questdb": "SELECT id1, id2, id3, id4, id5, id6, SUM(v3), COUNT(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6", "rayforce": "t.select(v3=Column(\"v3\").sum(), cnt=Column(\"v1\").count()).by(\"id1\",\"id2\",\"id3\",\"id4\",\"id5\",\"id6\").execute()", "timescale": "SELECT id1, id2, id3, id4, id5, id6, SUM(v3), COUNT(v1) FROM data GROUP BY id1, id2, id3, id4, id5, id6"}, "join_q1": {"chdb": "SELECT * FROM x INNER JOIN small USING (id1)", "datafusion": "SELECT * FROM x INNER JOIN small USING (id1)", "duckdb": "SELECT * FROM x INNER JOIN small USING (id1)", "pandas": "x.merge(small, on=\"id1\")", "polars": "x.join(small, on=\"id1\")", "questdb": "SELECT * FROM x INNER JOIN small ON x.id1 = small.id1", "rayforce": "# pre-project right to (key, v2) to avoid to_dict() collapse on dup cols\nx.inner_join(small.select(\"id1\",\"v2\").execute(), on=[\"id1\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN small USING (id1)"}, "join_q2": {"chdb": "SELECT * FROM x INNER JOIN medium USING (id2)", "datafusion": "SELECT * FROM x INNER JOIN medium USING (id2)", "duckdb": "SELECT * FROM x INNER JOIN medium USING (id2)", "pandas": "x.merge(medium, on=\"id2\")", "polars": "x.join(medium, on=\"id2\")", "questdb": "SELECT * FROM x INNER JOIN medium ON x.id2 = medium.id2", "rayforce": "x.inner_join(medium.select(\"id2\",\"v2\").execute(), on=[\"id2\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN medium USING (id2)"}, "join_q3": {"chdb": "SELECT * FROM x LEFT JOIN medium USING (id2)", "datafusion": "SELECT * FROM x LEFT JOIN medium USING (id2)", "duckdb": "SELECT * FROM x LEFT JOIN medium USING (id2)", "pandas": "x.merge(medium, on=\"id2\", how=\"left\")", "polars": "x.join(medium, on=\"id2\", how=\"left\")", "questdb": "SELECT * FROM x LEFT JOIN medium ON x.id2 = medium.id2", "rayforce": "x.left_join(medium.select(\"id2\",\"v2\").execute(), on=[\"id2\"]).execute()", "timescale": "SELECT * FROM x LEFT JOIN medium USING (id2)"}, "join_q4": {"chdb": "SELECT * FROM x INNER JOIN medium USING (id5)", "datafusion": "SELECT * FROM x INNER JOIN medium USING (id5)", "duckdb": "SELECT * FROM x INNER JOIN medium USING (id5)", "pandas": "x.merge(medium, on=\"id5\")", "polars": "x.join(medium, on=\"id5\")", "questdb": "SELECT * FROM x INNER JOIN medium ON x.id5 = medium.id5", "rayforce": "x.inner_join(medium.select(\"id5\",\"v2\").execute(), on=[\"id5\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN medium USING (id5)"}, "join_q5": {"chdb": "SELECT * FROM x INNER JOIN big USING (id3)", "datafusion": "SELECT * FROM x INNER JOIN big USING (id3)", "duckdb": "SELECT * FROM x INNER JOIN big USING (id3)", "pandas": "x.merge(big, on=\"id3\")", "polars": "x.join(big, on=\"id3\")", "questdb": "SELECT * FROM x INNER JOIN big ON x.id3 = big.id3", "rayforce": "x.inner_join(big.select(\"id3\",\"v2\").execute(), on=[\"id3\"]).execute()", "timescale": "SELECT * FROM x INNER JOIN big USING (id3)"}, "join_inner": {"chdb": "SELECT * FROM left INNER JOIN right USING (id1, id2, id3)", "datafusion": "SELECT * FROM left INNER JOIN right USING (id1, id2, id3)", "duckdb": "SELECT * FROM left INNER JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "pandas": "left.merge(right, on=[\"id1\",\"id2\",\"id3\"], how=\"inner\")", "polars": "left.join(right, on=[\"id1\",\"id2\",\"id3\"], how=\"inner\")", "questdb": "SELECT * FROM left INNER JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "rayforce": "L.inner_join(R, on=[\"id1\",\"id2\",\"id3\"]).execute()", "timescale": "SELECT * FROM left INNER JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3"}, "join_left": {"chdb": "SELECT * FROM left LEFT JOIN right USING (id1, id2, id3)", "datafusion": "SELECT * FROM left LEFT JOIN right USING (id1, id2, id3)", "duckdb": "SELECT * FROM left LEFT JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "pandas": "left.merge(right, on=[\"id1\",\"id2\",\"id3\"], how=\"left\")", "polars": "left.join(right, on=[\"id1\",\"id2\",\"id3\"], how=\"left\")", "questdb": "SELECT * FROM left LEFT JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3", "rayforce": "L.left_join(R, on=[\"id1\",\"id2\",\"id3\"]).execute()", "timescale": "SELECT * FROM left LEFT JOIN right ON left.id1=right.id1 AND left.id2=right.id2 AND left.id3=right.id3"}, "sort_single": {"chdb": "SELECT * FROM data ORDER BY id1", "datafusion": "SELECT * FROM data ORDER BY id1", "duckdb": "SELECT * FROM data ORDER BY id1", "pandas": "df.sort_values(\"id1\")", "polars": "df.sort(\"id1\")", "questdb": "SELECT * FROM data ORDER BY id1", "rayforce": "t.order_by(\"id1\").execute()", "timescale": "SELECT * FROM data ORDER BY id1"}, "sort_multi": {"chdb": "SELECT * FROM data ORDER BY id1, id2, id3", "datafusion": "SELECT * FROM data ORDER BY id1, id2, id3", "duckdb": "SELECT * FROM data ORDER BY id1, id2, id3", "pandas": "df.sort_values([\"id1\",\"id2\",\"id3\"])", "polars": "df.sort(\"id1\",\"id2\",\"id3\")", "questdb": "SELECT * FROM data ORDER BY id1, id2, id3", "rayforce": "t.order_by(\"id1\",\"id2\",\"id3\").execute()", "timescale": "SELECT * FROM data ORDER BY id1, id2, id3"}}}; diff --git a/docs/data.json b/docs/data.json index b97e834..50070e0 100644 --- a/docs/data.json +++ b/docs/data.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-05-08T21:19:49+03:00", + "generated_at": "2026-05-17T10:18:12+03:00", "comparison": { "adapters": [ "chdb", @@ -36,327 +36,327 @@ { "adapter": "rayforce", "task": "groupby_q1", - "median_ms": 5.824734 + "median_ms": 6.971128 }, { "adapter": "rayforce", "task": "groupby_q2", - "median_ms": 15.773305 + "median_ms": 17.370518 }, { "adapter": "rayforce", "task": "groupby_q3", - "median_ms": 36.67285 + "median_ms": 37.959069 }, { "adapter": "rayforce", "task": "groupby_q4", - "median_ms": 10.797913 + "median_ms": 11.93403 }, { "adapter": "rayforce", "task": "groupby_q5", - "median_ms": 61.089761 + "median_ms": 62.402688 }, { "adapter": "rayforce", "task": "groupby_q6", - "median_ms": 0.0 + "median_ms": 75.30657 }, { "adapter": "rayforce", "task": "groupby_q7", - "median_ms": 41.137825 + "median_ms": 59.033556 }, { "adapter": "rayforce", "task": "groupby_q8", - "median_ms": 0.0 + "median_ms": 43.989458 }, { "adapter": "rayforce", "task": "groupby_q9", - "median_ms": 0.0 + "median_ms": 67.840728 }, { "adapter": "rayforce", "task": "groupby_q10", - "median_ms": 136.68509 + "median_ms": 170.703976 }, { "adapter": "polars", "task": "groupby_q1", - "median_ms": 30.689921 + "median_ms": 31.00837 }, { "adapter": "polars", "task": "groupby_q2", - "median_ms": 213.584089 + "median_ms": 223.737076 }, { "adapter": "polars", "task": "groupby_q3", - "median_ms": 271.027953 + "median_ms": 271.057923 }, { "adapter": "polars", "task": "groupby_q4", - "median_ms": 29.380641 + "median_ms": 29.21685 }, { "adapter": "polars", "task": "groupby_q5", - "median_ms": 168.814247 + "median_ms": 175.504448 }, { "adapter": "polars", "task": "groupby_q6", - "median_ms": 244.154439 + "median_ms": 236.048245 }, { "adapter": "polars", "task": "groupby_q7", - "median_ms": 264.496787 + "median_ms": 277.398113 }, { "adapter": "polars", "task": "groupby_q8", - "median_ms": 495.520495 + "median_ms": 495.63612 }, { "adapter": "polars", "task": "groupby_q9", - "median_ms": 392.851922 + "median_ms": 431.610605 }, { "adapter": "polars", "task": "groupby_q10", - "median_ms": 1948.775121 + "median_ms": 2018.400285 }, { "adapter": "duckdb", "task": "groupby_q1", - "median_ms": 33.261511 + "median_ms": 34.47726 }, { "adapter": "duckdb", "task": "groupby_q2", - "median_ms": 48.503989 + "median_ms": 53.847835 }, { "adapter": "duckdb", "task": "groupby_q3", - "median_ms": 96.426018 + "median_ms": 101.22585 }, { "adapter": "duckdb", "task": "groupby_q4", - "median_ms": 8.087284 + "median_ms": 8.897053 }, { "adapter": "duckdb", "task": "groupby_q5", - "median_ms": 100.674962 + "median_ms": 105.269338 }, { "adapter": "duckdb", "task": "groupby_q6", - "median_ms": 175.603334 + "median_ms": 189.077741 }, { "adapter": "duckdb", "task": "groupby_q7", - "median_ms": 96.850147 + "median_ms": 99.3353 }, { "adapter": "duckdb", "task": "groupby_q8", - "median_ms": 173.281259 + "median_ms": 158.839282 }, { "adapter": "duckdb", "task": "groupby_q9", - "median_ms": 72.208458 + "median_ms": 75.138824 }, { "adapter": "duckdb", "task": "groupby_q10", - "median_ms": 1420.718039 + "median_ms": 373.400973 }, { "adapter": "chdb", "task": "groupby_q1", - "median_ms": 37.049554 + "median_ms": 30.309354 }, { "adapter": "chdb", "task": "groupby_q2", - "median_ms": 185.160349 + "median_ms": 168.095397 }, { "adapter": "chdb", "task": "groupby_q3", - "median_ms": 232.491878 + "median_ms": 216.618125 }, { "adapter": "chdb", "task": "groupby_q4", - "median_ms": 43.029803 + "median_ms": 43.141467 }, { "adapter": "chdb", "task": "groupby_q5", - "median_ms": 195.371126 + "median_ms": 177.327928 }, { "adapter": "chdb", "task": "groupby_q6", - "median_ms": 460.748488 + "median_ms": 447.381146 }, { "adapter": "chdb", "task": "groupby_q7", - "median_ms": 225.359802 + "median_ms": 217.702943 }, { "adapter": "chdb", "task": "groupby_q8", - "median_ms": 528.665069 + "median_ms": 530.706351 }, { "adapter": "chdb", "task": "groupby_q9", - "median_ms": 200.849423 + "median_ms": 198.329672 }, { "adapter": "chdb", "task": "groupby_q10", - "median_ms": 2717.821956 + "median_ms": 745.036899 }, { "adapter": "datafusion", "task": "groupby_q1", - "median_ms": 110.666562 + "median_ms": 20.182904 }, { "adapter": "datafusion", "task": "groupby_q2", - "median_ms": 166.61382 + "median_ms": 38.128968 }, { "adapter": "datafusion", "task": "groupby_q3", - "median_ms": 265.885071 + "median_ms": 150.373084 }, { "adapter": "datafusion", "task": "groupby_q4", - "median_ms": 167.155003 + "median_ms": 17.605885 }, { "adapter": "datafusion", "task": "groupby_q5", - "median_ms": 263.269545 + "median_ms": 128.626816 }, { "adapter": "datafusion", "task": "groupby_q6", - "median_ms": 262.106614 + "median_ms": 143.032423 }, { "adapter": "datafusion", "task": "groupby_q7", - "median_ms": 248.573369 + "median_ms": 124.493897 }, { "adapter": "datafusion", "task": "groupby_q8", - "median_ms": 370.824711 + "median_ms": 256.078106 }, { "adapter": "datafusion", "task": "groupby_q9", - "median_ms": 208.592801 + "median_ms": 70.639973 }, { "adapter": "datafusion", "task": "groupby_q10", - "median_ms": 570.332521 + "median_ms": 417.641037 }, { "adapter": "pandas", "task": "groupby_q1", - "median_ms": 229.647895 + "median_ms": 229.841606 }, { "adapter": "pandas", "task": "groupby_q2", - "median_ms": 621.61714 + "median_ms": 613.169059 }, { "adapter": "pandas", "task": "groupby_q3", - "median_ms": 764.026452 + "median_ms": 850.615701 }, { "adapter": "pandas", "task": "groupby_q4", - "median_ms": 233.908612 + "median_ms": 240.789596 }, { "adapter": "pandas", "task": "groupby_q5", - "median_ms": 375.992715 + "median_ms": 398.761776 }, { "adapter": "pandas", "task": "groupby_q6", - "median_ms": 673.779485 + "median_ms": 687.80712 }, { "adapter": "pandas", "task": "groupby_q7", - "median_ms": 789.611511 + "median_ms": 852.80892 }, { "adapter": "pandas", "task": "groupby_q8", - "median_ms": 6682.51042 + "median_ms": 6856.271032 }, { "adapter": "pandas", "task": "groupby_q9", - "median_ms": 7794.240162 + "median_ms": 7354.730963 }, { "adapter": "pandas", "task": "groupby_q10", - "median_ms": 6875.477569 + "median_ms": 6915.796766 }, { "adapter": "questdb", "task": "groupby_q1", - "median_ms": 10.059147 + "median_ms": 13.754442 }, { "adapter": "questdb", "task": "groupby_q2", - "median_ms": 46.691301 + "median_ms": 54.615929 }, { "adapter": "questdb", "task": "groupby_q3", - "median_ms": 295.832835 + "median_ms": 326.988248 }, { "adapter": "questdb", "task": "groupby_q4", - "median_ms": 42.878789 + "median_ms": 37.296032 }, { "adapter": "questdb", "task": "groupby_q5", - "median_ms": 191.967352 + "median_ms": 310.113192 }, { "adapter": "questdb", @@ -366,432 +366,432 @@ { "adapter": "questdb", "task": "groupby_q7", - "median_ms": 202.020358 + "median_ms": 221.769039 }, { "adapter": "questdb", "task": "groupby_q8", - "median_ms": 31271.169311 + "median_ms": 30534.313617 }, { "adapter": "questdb", "task": "groupby_q9", - "median_ms": 76.670477 + "median_ms": 79.349774 }, { "adapter": "questdb", "task": "groupby_q10", - "median_ms": 6486.463958 + "median_ms": 5392.72611 }, { "adapter": "timescale", "task": "groupby_q1", - "median_ms": 451.701025 + "median_ms": 457.907655 }, { "adapter": "timescale", "task": "groupby_q2", - "median_ms": 657.685408 + "median_ms": 668.948013 }, { "adapter": "timescale", "task": "groupby_q3", - "median_ms": 1828.913023 + "median_ms": 1865.398248 }, { "adapter": "timescale", "task": "groupby_q4", - "median_ms": 449.590928 + "median_ms": 448.068686 }, { "adapter": "timescale", "task": "groupby_q5", - "median_ms": 1624.504323 + "median_ms": 1652.03214 }, { "adapter": "timescale", "task": "groupby_q6", - "median_ms": 4229.017522 + "median_ms": 4253.313371 }, { "adapter": "timescale", "task": "groupby_q7", - "median_ms": 1211.633235 + "median_ms": 1225.879392 }, { "adapter": "timescale", "task": "groupby_q8", - "median_ms": 3356.493516 + "median_ms": 3368.934544 }, { "adapter": "timescale", "task": "groupby_q9", - "median_ms": 658.750862 + "median_ms": 639.574708 }, { "adapter": "timescale", "task": "groupby_q10", - "median_ms": 23274.876232 + "median_ms": 23896.354027 }, { "adapter": "rayforce", "task": "join_q1", - "median_ms": 139.626633 + "median_ms": 133.684225 }, { "adapter": "rayforce", "task": "join_q2", - "median_ms": 137.884081 + "median_ms": 131.822446 }, { "adapter": "rayforce", "task": "join_q3", - "median_ms": 127.8927 + "median_ms": 132.115353 }, { "adapter": "rayforce", "task": "join_q4", - "median_ms": 124.704141 + "median_ms": 129.174564 }, { "adapter": "rayforce", "task": "join_q5", - "median_ms": 316.303236 + "median_ms": 324.349827 }, { "adapter": "polars", "task": "join_q1", - "median_ms": 227.369517 + "median_ms": 228.126112 }, { "adapter": "polars", "task": "join_q2", - "median_ms": 332.310053 + "median_ms": 355.019194 }, { "adapter": "polars", "task": "join_q3", - "median_ms": 93.6474 + "median_ms": 93.644997 }, { "adapter": "polars", "task": "join_q4", - "median_ms": 469.305043 + "median_ms": 465.343039 }, { "adapter": "polars", "task": "join_q5", - "median_ms": 865.532423 + "median_ms": 883.113051 }, { "adapter": "duckdb", "task": "join_q1", - "median_ms": 1371.014224 + "median_ms": 170.825968 }, { "adapter": "duckdb", "task": "join_q2", - "median_ms": 1637.421211 + "median_ms": 219.499909 }, { "adapter": "duckdb", "task": "join_q3", - "median_ms": 1542.86457 + "median_ms": 239.067777 }, { "adapter": "duckdb", "task": "join_q4", - "median_ms": 1522.447843 + "median_ms": 231.098126 }, { "adapter": "duckdb", "task": "join_q5", - "median_ms": 2474.130783 + "median_ms": 625.502572 }, { "adapter": "chdb", "task": "join_q1", - "median_ms": 3790.317239 + "median_ms": 133.41584 }, { "adapter": "chdb", "task": "join_q2", - "median_ms": 4333.404806 + "median_ms": 182.203326 }, { "adapter": "chdb", "task": "join_q3", - "median_ms": 4343.175706 + "median_ms": 177.654087 }, { "adapter": "chdb", "task": "join_q4", - "median_ms": 3988.218096 + "median_ms": 190.054905 }, { "adapter": "chdb", "task": "join_q5", - "median_ms": 5653.989488 + "median_ms": 1676.37437 }, { "adapter": "datafusion", "task": "join_q1", - "median_ms": 698.685422 + "median_ms": 93.875846 }, { "adapter": "datafusion", "task": "join_q2", - "median_ms": 696.903756 + "median_ms": 102.736336 }, { "adapter": "datafusion", "task": "join_q3", - "median_ms": 692.506079 + "median_ms": 100.719203 }, { "adapter": "datafusion", "task": "join_q4", - "median_ms": 697.640789 + "median_ms": 103.574957 }, { "adapter": "datafusion", "task": "join_q5", - "median_ms": 1170.396308 + "median_ms": 823.296592 }, { "adapter": "pandas", "task": "join_q1", - "median_ms": 1039.571785 + "median_ms": 1074.519474 }, { "adapter": "pandas", "task": "join_q2", - "median_ms": 1334.793094 + "median_ms": 1362.755713 }, { "adapter": "pandas", "task": "join_q3", - "median_ms": 751.5803 + "median_ms": 765.282509 }, { "adapter": "pandas", "task": "join_q4", - "median_ms": 1577.257524 + "median_ms": 1613.520633 }, { "adapter": "pandas", "task": "join_q5", - "median_ms": 7494.925995 + "median_ms": 7558.863074 }, { "adapter": "questdb", "task": "join_q1", - "median_ms": 15456.403114 + "median_ms": 13020.719882 }, { "adapter": "questdb", "task": "join_q2", - "median_ms": 17924.925455 + "median_ms": 15536.930515 }, { "adapter": "questdb", "task": "join_q3", - "median_ms": 18054.476508 + "median_ms": 15685.713258 }, { "adapter": "questdb", "task": "join_q4", - "median_ms": 17933.876613 + "median_ms": 16032.972385 }, { "adapter": "questdb", "task": "join_q5", - "median_ms": 40189.311438 + "median_ms": 37404.923365 }, { "adapter": "timescale", "task": "join_q1", - "median_ms": 11685.364106 + "median_ms": 11657.483562 }, { "adapter": "timescale", "task": "join_q2", - "median_ms": 13117.115676 + "median_ms": 13493.257667 }, { "adapter": "timescale", "task": "join_q3", - "median_ms": 12923.243807 + "median_ms": 13311.392802 }, { "adapter": "timescale", "task": "join_q4", - "median_ms": 13876.999323 + "median_ms": 14279.013058 }, { "adapter": "timescale", "task": "join_q5", - "median_ms": 26048.01391 + "median_ms": 26488.992098 }, { "adapter": "rayforce", "task": "join_inner", - "median_ms": 67.333512 + "median_ms": 68.658811 }, { "adapter": "rayforce", "task": "join_left", - "median_ms": 439.064739 + "median_ms": 299.814965 }, { "adapter": "polars", "task": "join_inner", - "median_ms": 346.188391 + "median_ms": 374.725466 }, { "adapter": "polars", "task": "join_left", - "median_ms": 641.749333 + "median_ms": 675.882019 }, { "adapter": "duckdb", "task": "join_inner", - "median_ms": 240.455789 + "median_ms": 273.3836 }, { "adapter": "duckdb", "task": "join_left", - "median_ms": 2026.235215 + "median_ms": 380.237764 }, { "adapter": "chdb", "task": "join_inner", - "median_ms": 1250.392767 + "median_ms": 1022.721439 }, { "adapter": "chdb", "task": "join_left", - "median_ms": 4225.68489 + "median_ms": 1085.583315 }, { "adapter": "datafusion", "task": "join_inner", - "median_ms": 714.064069 + "median_ms": 570.69442 }, { "adapter": "datafusion", "task": "join_left", - "median_ms": 813.664937 + "median_ms": 656.896961 }, { "adapter": "pandas", "task": "join_inner", - "median_ms": 5036.570364 + "median_ms": 5215.469562 }, { "adapter": "pandas", "task": "join_left", - "median_ms": 6210.174028 + "median_ms": 6309.372632 }, { "adapter": "questdb", "task": "join_inner", - "median_ms": 4239.732024 + "median_ms": 4136.601352 }, { "adapter": "questdb", "task": "join_left", - "median_ms": 14564.9725 + "median_ms": 13466.748286 }, { "adapter": "timescale", "task": "join_inner", - "median_ms": 2180.926924 + "median_ms": 15521.955667 }, { "adapter": "timescale", "task": "join_left", - "median_ms": 10424.640642 + "median_ms": 10590.248085 }, { "adapter": "rayforce", "task": "sort_single", - "median_ms": 79.849295 + "median_ms": 86.990622 }, { "adapter": "rayforce", "task": "sort_multi", - "median_ms": 258.755638 + "median_ms": 266.08366 }, { "adapter": "polars", "task": "sort_single", - "median_ms": 565.545102 + "median_ms": 600.401362 }, { "adapter": "polars", "task": "sort_multi", - "median_ms": 1929.284059 + "median_ms": 1983.182276 }, { "adapter": "duckdb", "task": "sort_single", - "median_ms": 1802.66877 + "median_ms": 359.759423 }, { "adapter": "duckdb", "task": "sort_multi", - "median_ms": 5844.444768 + "median_ms": 1159.718102 }, { "adapter": "chdb", "task": "sort_single", - "median_ms": 2390.842804 + "median_ms": 546.844065 }, { "adapter": "chdb", "task": "sort_multi", - "median_ms": 5627.522778 + "median_ms": 5437.768278 }, { "adapter": "datafusion", "task": "sort_single", - "median_ms": 1263.511666 + "median_ms": 1040.708312 }, { "adapter": "datafusion", "task": "sort_multi", - "median_ms": 2094.198292 + "median_ms": 2229.318302 }, { "adapter": "pandas", "task": "sort_single", - "median_ms": 9536.816694 + "median_ms": 9571.246642 }, { "adapter": "pandas", "task": "sort_multi", - "median_ms": 8870.207739 + "median_ms": 8458.088126 }, { "adapter": "questdb", "task": "sort_single", - "median_ms": 17706.632356 + "median_ms": 16907.407046 }, { "adapter": "questdb", "task": "sort_multi", - "median_ms": 21468.560059 + "median_ms": 21165.373496 }, { "adapter": "timescale", "task": "sort_single", - "median_ms": 12758.780267 + "median_ms": 13092.980246 }, { "adapter": "timescale", "task": "sort_multi", - "median_ms": 22120.174409 + "median_ms": 22936.383768 } ] }, @@ -800,121 +800,121 @@ { "adapter": "chdb", "values": [ - 37.049554, - 29.175246, - 70.931838 + 30.075177, + 30.309354, + 50.954611 ], "boxplot": [ - 29.175246, - 29.175246, - 37.049554, - 70.931838, - 70.931838 + 30.075177, + 30.075177, + 30.309354, + 50.954611, + 50.954611 ] }, { "adapter": "datafusion", "values": [ - 112.497739, - 109.655191, - 110.666562 + 15.606038, + 20.182904, + 21.68953 ], "boxplot": [ - 109.655191, - 109.655191, - 110.666562, - 112.497739, - 112.497739 + 15.606038, + 15.606038, + 20.182904, + 21.68953, + 21.68953 ] }, { "adapter": "duckdb", "values": [ - 33.347455, - 33.261511, - 33.090625 + 36.072355, + 34.47726, + 33.939814 ], "boxplot": [ - 33.090625, - 33.090625, - 33.261511, - 33.347455, - 33.347455 + 33.939814, + 33.939814, + 34.47726, + 36.072355, + 36.072355 ] }, { "adapter": "pandas", "values": [ - 223.245779, - 229.647895, - 231.175662 + 227.792444, + 230.340678, + 229.841606 ], "boxplot": [ - 223.245779, - 223.245779, - 229.647895, - 231.175662, - 231.175662 + 227.792444, + 227.792444, + 229.841606, + 230.340678, + 230.340678 ] }, { "adapter": "polars", "values": [ - 29.985236, - 30.689921, - 30.690402 + 31.377755, + 30.769213, + 31.00837 ], "boxplot": [ - 29.985236, - 29.985236, - 30.689921, - 30.690402, - 30.690402 + 30.769213, + 30.769213, + 31.00837, + 31.377755, + 31.377755 ] }, { "adapter": "questdb", "values": [ - 9.943756, - 10.404988, - 10.059147 + 16.679104, + 13.754442, + 12.100154 ], "boxplot": [ - 9.943756, - 9.943756, - 10.059147, - 10.404988, - 10.404988 + 12.100154, + 12.100154, + 13.754442, + 16.679104, + 16.679104 ] }, { "adapter": "rayforce", "values": [ - 5.113977, - 5.824734, - 6.01083 + 6.971128, + 7.071989, + 6.589428 ], "boxplot": [ - 5.113977, - 5.113977, - 5.824734, - 6.01083, - 6.01083 + 6.589428, + 6.589428, + 6.971128, + 7.071989, + 7.071989 ] }, { "adapter": "timescale", "values": [ - 461.70261, - 451.701025, - 447.754562 + 467.887003, + 457.907655, + 452.756672 ], "boxplot": [ - 447.754562, - 447.754562, - 451.701025, - 461.70261, - 461.70261 + 452.756672, + 452.756672, + 457.907655, + 467.887003, + 467.887003 ] } ], @@ -922,121 +922,121 @@ { "adapter": "chdb", "values": [ - 2738.960845, - 2717.821956, - 2700.950929 + 745.036899, + 706.385092, + 771.160531 ], "boxplot": [ - 2700.950929, - 2700.950929, - 2717.821956, - 2738.960845, - 2738.960845 + 706.385092, + 706.385092, + 745.036899, + 771.160531, + 771.160531 ] }, { "adapter": "datafusion", "values": [ - 567.850061, - 570.332521, - 582.867448 + 411.098489, + 420.333586, + 417.641037 ], "boxplot": [ - 567.850061, - 567.850061, - 570.332521, - 582.867448, - 582.867448 + 411.098489, + 411.098489, + 417.641037, + 420.333586, + 420.333586 ] }, { "adapter": "duckdb", "values": [ - 1420.718039, - 1467.561213, - 1370.063918 + 371.334378, + 373.668063, + 373.400973 ], "boxplot": [ - 1370.063918, - 1370.063918, - 1420.718039, - 1467.561213, - 1467.561213 + 371.334378, + 371.334378, + 373.400973, + 373.668063, + 373.668063 ] }, { "adapter": "pandas", "values": [ - 6875.477569, - 6858.229749, - 6936.565808 + 6909.260175, + 6915.796766, + 6986.441074 ], "boxplot": [ - 6858.229749, - 6858.229749, - 6875.477569, - 6936.565808, - 6936.565808 + 6909.260175, + 6909.260175, + 6915.796766, + 6986.441074, + 6986.441074 ] }, { "adapter": "polars", "values": [ - 1948.775121, - 1926.695459, - 1952.751584 + 2018.400285, + 2072.362224, + 2018.337999 ], "boxplot": [ - 1926.695459, - 1926.695459, - 1948.775121, - 1952.751584, - 1952.751584 + 2018.337999, + 2018.337999, + 2018.400285, + 2072.362224, + 2072.362224 ] }, { "adapter": "questdb", "values": [ - 6460.019675, - 6646.804895, - 6486.463958 + 5657.313685, + 5353.85678, + 5392.72611 ], "boxplot": [ - 6460.019675, - 6460.019675, - 6486.463958, - 6646.804895, - 6646.804895 + 5353.85678, + 5353.85678, + 5392.72611, + 5657.313685, + 5657.313685 ] }, { "adapter": "rayforce", "values": [ - 136.68509, - 133.69049, - 138.541204 + 175.923529, + 170.703976, + 169.565472 ], "boxplot": [ - 133.69049, - 133.69049, - 136.68509, - 138.541204, - 138.541204 + 169.565472, + 169.565472, + 170.703976, + 175.923529, + 175.923529 ] }, { "adapter": "timescale", "values": [ - 23300.017014, - 23274.876232, - 22831.657517 + 23935.895926, + 23870.166229, + 23896.354027 ], "boxplot": [ - 22831.657517, - 22831.657517, - 23274.876232, - 23300.017014, - 23300.017014 + 23870.166229, + 23870.166229, + 23896.354027, + 23935.895926, + 23935.895926 ] } ], @@ -1044,121 +1044,121 @@ { "adapter": "chdb", "values": [ - 185.160349, - 181.554795, - 219.830719 + 168.095397, + 165.454256, + 184.617995 ], "boxplot": [ - 181.554795, - 181.554795, - 185.160349, - 219.830719, - 219.830719 + 165.454256, + 165.454256, + 168.095397, + 184.617995, + 184.617995 ] }, { "adapter": "datafusion", "values": [ - 167.735813, - 164.897392, - 166.61382 + 38.128968, + 37.157484, + 38.326345 ], "boxplot": [ - 164.897392, - 164.897392, - 166.61382, - 167.735813, - 167.735813 + 37.157484, + 37.157484, + 38.128968, + 38.326345, + 38.326345 ] }, { "adapter": "duckdb", "values": [ - 48.930935, - 48.411253, - 48.503989 + 51.937208, + 53.847835, + 55.077853 ], "boxplot": [ - 48.411253, - 48.411253, - 48.503989, - 48.930935, - 48.930935 + 51.937208, + 51.937208, + 53.847835, + 55.077853, + 55.077853 ] }, { "adapter": "pandas", "values": [ - 621.61714, - 609.712817, - 636.172884 + 613.169059, + 597.593189, + 615.624144 ], "boxplot": [ - 609.712817, - 609.712817, - 621.61714, - 636.172884, - 636.172884 + 597.593189, + 597.593189, + 613.169059, + 615.624144, + 615.624144 ] }, { "adapter": "polars", "values": [ - 213.75188, - 211.306829, - 213.584089 + 218.895084, + 232.082686, + 223.737076 ], "boxplot": [ - 211.306829, - 211.306829, - 213.584089, - 213.75188, - 213.75188 + 218.895084, + 218.895084, + 223.737076, + 232.082686, + 232.082686 ] }, { "adapter": "questdb", "values": [ - 52.147188, - 45.731087, - 46.691301 + 219.460799, + 54.615929, + 41.511749 ], "boxplot": [ - 45.731087, - 45.731087, - 46.691301, - 52.147188, - 52.147188 + 41.511749, + 41.511749, + 54.615929, + 219.460799, + 219.460799 ] }, { "adapter": "rayforce", "values": [ - 16.078788, - 15.772053, - 15.773305 + 17.987205, + 17.370518, + 15.198452 ], "boxplot": [ - 15.772053, - 15.772053, - 15.773305, - 16.078788, - 16.078788 + 15.198452, + 15.198452, + 17.370518, + 17.987205, + 17.987205 ] }, { "adapter": "timescale", "values": [ - 667.177378, - 652.286445, - 657.685408 + 678.472903, + 668.948013, + 659.848184 ], "boxplot": [ - 652.286445, - 652.286445, - 657.685408, - 667.177378, - 667.177378 + 659.848184, + 659.848184, + 668.948013, + 678.472903, + 678.472903 ] } ], @@ -1166,121 +1166,121 @@ { "adapter": "chdb", "values": [ - 231.511836, - 232.491878, - 235.854789 + 217.093914, + 216.618125, + 204.097096 ], "boxplot": [ - 231.511836, - 231.511836, - 232.491878, - 235.854789, - 235.854789 + 204.097096, + 204.097096, + 216.618125, + 217.093914, + 217.093914 ] }, { "adapter": "datafusion", "values": [ - 265.885071, - 264.833613, - 280.268438 + 150.373084, + 144.967276, + 151.579897 ], "boxplot": [ - 264.833613, - 264.833613, - 265.885071, - 280.268438, - 280.268438 + 144.967276, + 144.967276, + 150.373084, + 151.579897, + 151.579897 ] }, { "adapter": "duckdb", "values": [ - 97.585182, - 94.160691, - 96.426018 + 101.22585, + 99.330923, + 102.358131 ], "boxplot": [ - 94.160691, - 94.160691, - 96.426018, - 97.585182, - 97.585182 + 99.330923, + 99.330923, + 101.22585, + 102.358131, + 102.358131 ] }, { "adapter": "pandas", "values": [ - 763.424423, - 764.026452, - 768.991913 + 850.615701, + 903.071604, + 828.636438 ], "boxplot": [ - 763.424423, - 763.424423, - 764.026452, - 768.991913, - 768.991913 + 828.636438, + 828.636438, + 850.615701, + 903.071604, + 903.071604 ] }, { "adapter": "polars", "values": [ - 273.320111, - 271.027953, - 260.854293 + 262.67921, + 271.057923, + 285.460926 ], "boxplot": [ - 260.854293, - 260.854293, - 271.027953, - 273.320111, - 273.320111 + 262.67921, + 262.67921, + 271.057923, + 285.460926, + 285.460926 ] }, { "adapter": "questdb", "values": [ - 295.832835, - 297.137286, - 272.968048 + 349.865451, + 326.988248, + 313.618922 ], "boxplot": [ - 272.968048, - 272.968048, - 295.832835, - 297.137286, - 297.137286 + 313.618922, + 313.618922, + 326.988248, + 349.865451, + 349.865451 ] }, { "adapter": "rayforce", "values": [ - 39.959566, - 36.67285, - 35.802146 + 40.409416, + 37.455688, + 37.959069 ], "boxplot": [ - 35.802146, - 35.802146, - 36.67285, - 39.959566, - 39.959566 + 37.455688, + 37.455688, + 37.959069, + 40.409416, + 40.409416 ] }, { "adapter": "timescale", "values": [ - 1828.913023, - 1817.952607, - 1830.471159 + 1879.657053, + 1865.398248, + 1857.158022 ], "boxplot": [ - 1817.952607, - 1817.952607, - 1828.913023, - 1830.471159, - 1830.471159 + 1857.158022, + 1857.158022, + 1865.398248, + 1879.657053, + 1879.657053 ] } ], @@ -1288,121 +1288,121 @@ { "adapter": "chdb", "values": [ - 43.029803, - 41.947507, - 83.556396 + 43.141467, + 43.012581, + 63.304444 ], "boxplot": [ - 41.947507, - 41.947507, - 43.029803, - 83.556396, - 83.556396 + 43.012581, + 43.012581, + 43.141467, + 63.304444, + 63.304444 ] }, { "adapter": "datafusion", "values": [ - 150.069756, - 170.179239, - 167.155003 + 15.416336, + 17.605885, + 19.100338 ], "boxplot": [ - 150.069756, - 150.069756, - 167.155003, - 170.179239, - 170.179239 + 15.416336, + 15.416336, + 17.605885, + 19.100338, + 19.100338 ] }, { "adapter": "duckdb", "values": [ - 8.087284, - 8.150254, - 7.958077 + 8.897053, + 8.744982, + 9.28855 ], "boxplot": [ - 7.958077, - 7.958077, - 8.087284, - 8.150254, - 8.150254 + 8.744982, + 8.744982, + 8.897053, + 9.28855, + 9.28855 ] }, { "adapter": "pandas", "values": [ - 233.908612, - 232.73989, - 234.583561 + 240.789596, + 240.664026, + 245.781364 ], "boxplot": [ - 232.73989, - 232.73989, - 233.908612, - 234.583561, - 234.583561 + 240.664026, + 240.664026, + 240.789596, + 245.781364, + 245.781364 ] }, { "adapter": "polars", "values": [ - 29.380641, - 29.386141, - 28.918848 + 29.21685, + 29.146827, + 29.258339 ], "boxplot": [ - 28.918848, - 28.918848, - 29.380641, - 29.386141, - 29.386141 + 29.146827, + 29.146827, + 29.21685, + 29.258339, + 29.258339 ] }, { "adapter": "questdb", "values": [ - 40.82078, - 42.878789, - 47.873055 + 48.458315, + 37.278799, + 37.296032 ], "boxplot": [ - 40.82078, - 40.82078, - 42.878789, - 47.873055, - 47.873055 + 37.278799, + 37.278799, + 37.296032, + 48.458315, + 48.458315 ] }, { "adapter": "rayforce", "values": [ - 10.995961, - 10.797913, - 10.553997 + 11.867614, + 11.985178, + 11.93403 ], "boxplot": [ - 10.553997, - 10.553997, - 10.797913, - 10.995961, - 10.995961 + 11.867614, + 11.867614, + 11.93403, + 11.985178, + 11.985178 ] }, { "adapter": "timescale", "values": [ - 459.409821, - 449.590928, - 447.816731 + 458.180315, + 447.245804, + 448.068686 ], "boxplot": [ - 447.816731, - 447.816731, - 449.590928, - 459.409821, - 459.409821 + 447.245804, + 447.245804, + 448.068686, + 458.180315, + 458.180315 ] } ], @@ -1410,121 +1410,121 @@ { "adapter": "chdb", "values": [ - 195.371126, - 200.064569, - 168.839589 + 177.327928, + 181.547443, + 156.327313 ], "boxplot": [ - 168.839589, - 168.839589, - 195.371126, - 200.064569, - 200.064569 + 156.327313, + 156.327313, + 177.327928, + 181.547443, + 181.547443 ] }, { "adapter": "datafusion", "values": [ - 263.269545, - 301.108784, - 263.235611 + 130.349835, + 128.626816, + 127.356921 ], "boxplot": [ - 263.235611, - 263.235611, - 263.269545, - 301.108784, - 301.108784 + 127.356921, + 127.356921, + 128.626816, + 130.349835, + 130.349835 ] }, { "adapter": "duckdb", "values": [ - 103.958402, - 100.674962, - 100.107939 + 105.269338, + 105.815801, + 102.233514 ], "boxplot": [ - 100.107939, - 100.107939, - 100.674962, - 103.958402, - 103.958402 + 102.233514, + 102.233514, + 105.269338, + 105.815801, + 105.815801 ] }, { "adapter": "pandas", "values": [ - 376.575549, - 375.992715, - 364.349653 + 398.761776, + 379.284981, + 415.15204 ], "boxplot": [ - 364.349653, - 364.349653, - 375.992715, - 376.575549, - 376.575549 + 379.284981, + 379.284981, + 398.761776, + 415.15204, + 415.15204 ] }, { "adapter": "polars", "values": [ - 183.687151, - 165.655004, - 168.814247 + 175.504448, + 224.236257, + 159.868681 ], "boxplot": [ - 165.655004, - 165.655004, - 168.814247, - 183.687151, - 183.687151 + 159.868681, + 159.868681, + 175.504448, + 224.236257, + 224.236257 ] }, { "adapter": "questdb", "values": [ - 191.967352, - 183.383533, - 198.527186 + 322.08493, + 213.978937, + 310.113192 ], "boxplot": [ - 183.383533, - 183.383533, - 191.967352, - 198.527186, - 198.527186 + 213.978937, + 213.978937, + 310.113192, + 322.08493, + 322.08493 ] }, { "adapter": "rayforce", "values": [ - 62.214389, - 61.089761, - 60.51337 + 65.203634, + 61.975833, + 62.402688 ], "boxplot": [ - 60.51337, - 60.51337, - 61.089761, - 62.214389, - 62.214389 + 61.975833, + 61.975833, + 62.402688, + 65.203634, + 65.203634 ] }, { "adapter": "timescale", "values": [ - 1664.131116, - 1624.504323, - 1622.679472 + 1652.03214, + 1679.963893, + 1647.886553 ], "boxplot": [ - 1622.679472, - 1622.679472, - 1624.504323, - 1664.131116, - 1664.131116 + 1647.886553, + 1647.886553, + 1652.03214, + 1679.963893, + 1679.963893 ] } ], @@ -1532,76 +1532,76 @@ { "adapter": "chdb", "values": [ - 460.748488, - 449.274797, - 464.248522 + 437.511256, + 450.033679, + 447.381146 ], "boxplot": [ - 449.274797, - 449.274797, - 460.748488, - 464.248522, - 464.248522 + 437.511256, + 437.511256, + 447.381146, + 450.033679, + 450.033679 ] }, { "adapter": "datafusion", "values": [ - 271.099958, - 262.106614, - 261.019298 + 139.685664, + 143.032423, + 151.995671 ], "boxplot": [ - 261.019298, - 261.019298, - 262.106614, - 271.099958, - 271.099958 + 139.685664, + 139.685664, + 143.032423, + 151.995671, + 151.995671 ] }, { "adapter": "duckdb", "values": [ - 178.457534, - 173.415576, - 175.603334 + 189.077741, + 191.188379, + 183.31979 ], "boxplot": [ - 173.415576, - 173.415576, - 175.603334, - 178.457534, - 178.457534 + 183.31979, + 183.31979, + 189.077741, + 191.188379, + 191.188379 ] }, { "adapter": "pandas", "values": [ - 670.758036, - 673.779485, - 675.716304 + 686.506148, + 687.80712, + 699.108641 ], "boxplot": [ - 670.758036, - 670.758036, - 673.779485, - 675.716304, - 675.716304 + 686.506148, + 686.506148, + 687.80712, + 699.108641, + 699.108641 ] }, { "adapter": "polars", "values": [ - 292.841119, - 217.460409, - 244.154439 + 236.048245, + 228.458577, + 237.111144 ], "boxplot": [ - 217.460409, - 217.460409, - 244.154439, - 292.841119, - 292.841119 + 228.458577, + 228.458577, + 236.048245, + 237.111144, + 237.111144 ] }, { @@ -1617,28 +1617,32 @@ }, { "adapter": "rayforce", - "values": [], + "values": [ + 73.930863, + 75.389647, + 75.30657 + ], "boxplot": [ - 0, - 0, - 0, - 0, - 0 + 73.930863, + 73.930863, + 75.30657, + 75.389647, + 75.389647 ] }, { "adapter": "timescale", "values": [ - 4300.140151, - 4228.737779, - 4229.017522 + 4288.52214, + 4253.313371, + 4236.182459 ], "boxplot": [ - 4228.737779, - 4228.737779, - 4229.017522, - 4300.140151, - 4300.140151 + 4236.182459, + 4236.182459, + 4253.313371, + 4288.52214, + 4288.52214 ] } ], @@ -1646,121 +1650,121 @@ { "adapter": "chdb", "values": [ - 218.712318, - 227.821102, - 225.359802 + 221.837696, + 217.702943, + 208.686864 ], "boxplot": [ - 218.712318, - 218.712318, - 225.359802, - 227.821102, - 227.821102 + 208.686864, + 208.686864, + 217.702943, + 221.837696, + 221.837696 ] }, { "adapter": "datafusion", "values": [ - 251.117758, - 248.573369, - 244.456998 + 122.917909, + 124.493897, + 126.632008 ], "boxplot": [ - 244.456998, - 244.456998, - 248.573369, - 251.117758, - 251.117758 + 122.917909, + 122.917909, + 124.493897, + 126.632008, + 126.632008 ] }, { "adapter": "duckdb", "values": [ - 96.850147, - 95.302511, - 97.10334 + 99.349377, + 99.3353, + 95.959096 ], "boxplot": [ - 95.302511, - 95.302511, - 96.850147, - 97.10334, - 97.10334 + 95.959096, + 95.959096, + 99.3353, + 99.349377, + 99.349377 ] }, { "adapter": "pandas", "values": [ - 783.775237, - 789.611511, - 812.500778 + 851.208556, + 857.957758, + 852.80892 ], "boxplot": [ - 783.775237, - 783.775237, - 789.611511, - 812.500778, - 812.500778 + 851.208556, + 851.208556, + 852.80892, + 857.957758, + 857.957758 ] }, { "adapter": "polars", "values": [ - 264.496787, - 268.220027, - 262.2626 + 267.884624, + 282.319928, + 277.398113 ], "boxplot": [ - 262.2626, - 262.2626, - 264.496787, - 268.220027, - 268.220027 + 267.884624, + 267.884624, + 277.398113, + 282.319928, + 282.319928 ] }, { "adapter": "questdb", "values": [ - 199.354898, - 203.69244, - 202.020358 + 206.141584, + 223.81294, + 221.769039 ], "boxplot": [ - 199.354898, - 199.354898, - 202.020358, - 203.69244, - 203.69244 + 206.141584, + 206.141584, + 221.769039, + 223.81294, + 223.81294 ] }, { "adapter": "rayforce", "values": [ - 43.56423, - 41.137825, - 40.379437 + 58.311829, + 59.033556, + 60.133716 ], "boxplot": [ - 40.379437, - 40.379437, - 41.137825, - 43.56423, - 43.56423 + 58.311829, + 58.311829, + 59.033556, + 60.133716, + 60.133716 ] }, { "adapter": "timescale", "values": [ - 1215.698486, - 1211.633235, - 1211.128534 + 1252.793364, + 1221.843517, + 1225.879392 ], "boxplot": [ - 1211.128534, - 1211.128534, - 1211.633235, - 1215.698486, - 1215.698486 + 1221.843517, + 1221.843517, + 1225.879392, + 1252.793364, + 1252.793364 ] } ], @@ -1768,117 +1772,121 @@ { "adapter": "chdb", "values": [ - 535.998094, - 528.665069, - 485.810722 + 530.706351, + 533.881561, + 514.983689 ], "boxplot": [ - 485.810722, - 485.810722, - 528.665069, - 535.998094, - 535.998094 + 514.983689, + 514.983689, + 530.706351, + 533.881561, + 533.881561 ] }, { "adapter": "datafusion", "values": [ - 352.498837, - 370.824711, - 399.842014 + 256.078106, + 251.851259, + 256.674865 ], "boxplot": [ - 352.498837, - 352.498837, - 370.824711, - 399.842014, - 399.842014 + 251.851259, + 251.851259, + 256.078106, + 256.674865, + 256.674865 ] }, { "adapter": "duckdb", "values": [ - 173.281259, - 178.014908, - 153.555287 + 159.704022, + 152.659655, + 158.839282 ], "boxplot": [ - 153.555287, - 153.555287, - 173.281259, - 178.014908, - 178.014908 + 152.659655, + 152.659655, + 158.839282, + 159.704022, + 159.704022 ] }, { "adapter": "pandas", "values": [ - 6513.795886, - 7258.726115, - 6682.51042 + 6705.634094, + 6856.271032, + 7154.09041 ], "boxplot": [ - 6513.795886, - 6513.795886, - 6682.51042, - 7258.726115, - 7258.726115 + 6705.634094, + 6705.634094, + 6856.271032, + 7154.09041, + 7154.09041 ] }, { "adapter": "polars", "values": [ - 485.337669, - 552.945794, - 495.520495 + 487.55772, + 508.673446, + 495.63612 ], "boxplot": [ - 485.337669, - 485.337669, - 495.520495, - 552.945794, - 552.945794 + 487.55772, + 487.55772, + 495.63612, + 508.673446, + 508.673446 ] }, { "adapter": "questdb", "values": [ - 31271.169311, - 31251.402223, - 31535.395243 + 30668.65717, + 30512.405445, + 30534.313617 ], "boxplot": [ - 31251.402223, - 31251.402223, - 31271.169311, - 31535.395243, - 31535.395243 + 30512.405445, + 30512.405445, + 30534.313617, + 30668.65717, + 30668.65717 ] }, { "adapter": "rayforce", - "values": [], + "values": [ + 42.598564, + 43.989458, + 45.054301 + ], "boxplot": [ - 0, - 0, - 0, - 0, - 0 + 42.598564, + 42.598564, + 43.989458, + 45.054301, + 45.054301 ] }, { "adapter": "timescale", "values": [ - 3376.051508, - 3355.88689, - 3356.493516 + 3368.934544, + 3345.686203, + 3404.845627 ], "boxplot": [ - 3355.88689, - 3355.88689, - 3356.493516, - 3376.051508, - 3376.051508 + 3345.686203, + 3345.686203, + 3368.934544, + 3404.845627, + 3404.845627 ] } ], @@ -1886,117 +1894,121 @@ { "adapter": "chdb", "values": [ - 200.849423, - 196.012576, - 201.967037 + 187.950571, + 198.329672, + 201.627086 ], "boxplot": [ - 196.012576, - 196.012576, - 200.849423, - 201.967037, - 201.967037 + 187.950571, + 187.950571, + 198.329672, + 201.627086, + 201.627086 ] }, { "adapter": "datafusion", "values": [ - 233.804787, - 207.899127, - 208.592801 + 70.639973, + 71.333717, + 70.275789 ], "boxplot": [ - 207.899127, - 207.899127, - 208.592801, - 233.804787, - 233.804787 + 70.275789, + 70.275789, + 70.639973, + 71.333717, + 71.333717 ] }, { "adapter": "duckdb", "values": [ - 71.852498, - 73.164323, - 72.208458 + 73.456563, + 75.138824, + 77.146807 ], "boxplot": [ - 71.852498, - 71.852498, - 72.208458, - 73.164323, - 73.164323 + 73.456563, + 73.456563, + 75.138824, + 77.146807, + 77.146807 ] }, { "adapter": "pandas", "values": [ - 7339.298197, - 7794.240162, - 7873.434428 + 7768.392966, + 7239.147004, + 7354.730963 ], "boxplot": [ - 7339.298197, - 7339.298197, - 7794.240162, - 7873.434428, - 7873.434428 + 7239.147004, + 7239.147004, + 7354.730963, + 7768.392966, + 7768.392966 ] }, { "adapter": "polars", "values": [ - 392.851922, - 452.030147, - 390.87221 + 431.610605, + 413.220402, + 476.713528 ], "boxplot": [ - 390.87221, - 390.87221, - 392.851922, - 452.030147, - 452.030147 + 413.220402, + 413.220402, + 431.610605, + 476.713528, + 476.713528 ] }, { "adapter": "questdb", "values": [ - 73.774669, - 76.670477, - 81.838534 + 102.711411, + 79.349774, + 72.880712 ], "boxplot": [ - 73.774669, - 73.774669, - 76.670477, - 81.838534, - 81.838534 + 72.880712, + 72.880712, + 79.349774, + 102.711411, + 102.711411 ] }, { "adapter": "rayforce", - "values": [], + "values": [ + 66.571675, + 68.239047, + 67.840728 + ], "boxplot": [ - 0, - 0, - 0, - 0, - 0 + 66.571675, + 66.571675, + 67.840728, + 68.239047, + 68.239047 ] }, { "adapter": "timescale", "values": [ - 665.001356, - 658.750862, - 646.994238 + 655.428382, + 639.574708, + 637.106492 ], "boxplot": [ - 646.994238, - 646.994238, - 658.750862, - 665.001356, - 665.001356 + 637.106492, + 637.106492, + 639.574708, + 655.428382, + 655.428382 ] } ], @@ -2004,121 +2016,121 @@ { "adapter": "chdb", "values": [ - 1268.329478, - 1250.392767, - 1229.038304 + 1012.274315, + 1022.721439, + 1023.721092 ], "boxplot": [ - 1229.038304, - 1229.038304, - 1250.392767, - 1268.329478, - 1268.329478 + 1012.274315, + 1012.274315, + 1022.721439, + 1023.721092, + 1023.721092 ] }, { "adapter": "datafusion", "values": [ - 717.799117, - 714.064069, - 687.72829 + 565.558953, + 570.69442, + 571.91576 ], "boxplot": [ - 687.72829, - 687.72829, - 714.064069, - 717.799117, - 717.799117 + 565.558953, + 565.558953, + 570.69442, + 571.91576, + 571.91576 ] }, { "adapter": "duckdb", "values": [ - 240.455789, - 234.703648, - 240.737222 + 280.24663, + 273.37293, + 273.3836 ], "boxplot": [ - 234.703648, - 234.703648, - 240.455789, - 240.737222, - 240.737222 + 273.37293, + 273.37293, + 273.3836, + 280.24663, + 280.24663 ] }, { "adapter": "pandas", "values": [ - 5017.472359, - 5049.341722, - 5036.570364 + 5339.891511, + 5128.620853, + 5215.469562 ], "boxplot": [ - 5017.472359, - 5017.472359, - 5036.570364, - 5049.341722, - 5049.341722 + 5128.620853, + 5128.620853, + 5215.469562, + 5339.891511, + 5339.891511 ] }, { "adapter": "polars", "values": [ - 367.867113, - 344.224451, - 346.188391 + 374.725466, + 365.235395, + 394.558755 ], "boxplot": [ - 344.224451, - 344.224451, - 346.188391, - 367.867113, - 367.867113 + 365.235395, + 365.235395, + 374.725466, + 394.558755, + 394.558755 ] }, { "adapter": "questdb", "values": [ - 4237.398723, - 4245.178938, - 4239.732024 + 4182.294226, + 4136.601352, + 4135.077011 ], "boxplot": [ - 4237.398723, - 4237.398723, - 4239.732024, - 4245.178938, - 4245.178938 + 4135.077011, + 4135.077011, + 4136.601352, + 4182.294226, + 4182.294226 ] }, { "adapter": "rayforce", "values": [ - 68.680871, - 67.255766, - 67.333512 + 68.658811, + 67.90306, + 68.826462 ], "boxplot": [ - 67.255766, - 67.255766, - 67.333512, - 68.680871, - 68.680871 + 67.90306, + 67.90306, + 68.658811, + 68.826462, + 68.826462 ] }, { "adapter": "timescale", "values": [ - 2226.101583, - 2156.033235, - 2180.926924 + 15377.734909, + 15521.955667, + 15950.793847 ], "boxplot": [ - 2156.033235, - 2156.033235, - 2180.926924, - 2226.101583, - 2226.101583 + 15377.734909, + 15377.734909, + 15521.955667, + 15950.793847, + 15950.793847 ] } ], @@ -2126,121 +2138,121 @@ { "adapter": "chdb", "values": [ - 4225.68489, - 4393.482494, - 4120.886946 + 1113.352088, + 1036.152512, + 1085.583315 ], "boxplot": [ - 4120.886946, - 4120.886946, - 4225.68489, - 4393.482494, - 4393.482494 + 1036.152512, + 1036.152512, + 1085.583315, + 1113.352088, + 1113.352088 ] }, { "adapter": "datafusion", "values": [ - 813.664937, - 798.857639, - 827.319597 + 656.896961, + 676.332523, + 655.575121 ], "boxplot": [ - 798.857639, - 798.857639, - 813.664937, - 827.319597, - 827.319597 + 655.575121, + 655.575121, + 656.896961, + 676.332523, + 676.332523 ] }, { "adapter": "duckdb", "values": [ - 2013.606629, - 2026.235215, - 2035.802196 + 381.433935, + 367.134521, + 380.237764 ], "boxplot": [ - 2013.606629, - 2013.606629, - 2026.235215, - 2035.802196, - 2035.802196 + 367.134521, + 367.134521, + 380.237764, + 381.433935, + 381.433935 ] }, { "adapter": "pandas", "values": [ - 6216.491697, - 6152.147788, - 6210.174028 + 6340.149809, + 6260.063872, + 6309.372632 ], "boxplot": [ - 6152.147788, - 6152.147788, - 6210.174028, - 6216.491697, - 6216.491697 + 6260.063872, + 6260.063872, + 6309.372632, + 6340.149809, + 6340.149809 ] }, { "adapter": "polars", "values": [ - 687.331677, - 619.143617, - 641.749333 + 644.500853, + 675.882019, + 681.652517 ], "boxplot": [ - 619.143617, - 619.143617, - 641.749333, - 687.331677, - 687.331677 + 644.500853, + 644.500853, + 675.882019, + 681.652517, + 681.652517 ] }, { "adapter": "questdb", "values": [ - 14564.9725, - 14489.188657, - 14632.534854 + 13470.445384, + 13441.824417, + 13466.748286 ], "boxplot": [ - 14489.188657, - 14489.188657, - 14564.9725, - 14632.534854, - 14632.534854 + 13441.824417, + 13441.824417, + 13466.748286, + 13470.445384, + 13470.445384 ] }, { "adapter": "rayforce", "values": [ - 436.120515, - 446.241231, - 439.064739 + 297.712671, + 301.052773, + 299.814965 ], "boxplot": [ - 436.120515, - 436.120515, - 439.064739, - 446.241231, - 446.241231 + 297.712671, + 297.712671, + 299.814965, + 301.052773, + 301.052773 ] }, { "adapter": "timescale", "values": [ - 10424.640642, - 10367.638121, - 10426.827833 + 10489.896538, + 10590.248085, + 10695.033558 ], "boxplot": [ - 10367.638121, - 10367.638121, - 10424.640642, - 10426.827833, - 10426.827833 + 10489.896538, + 10489.896538, + 10590.248085, + 10695.033558, + 10695.033558 ] } ], @@ -2248,121 +2260,121 @@ { "adapter": "chdb", "values": [ - 3859.741547, - 3700.174006, - 3790.317239 + 132.321029, + 136.279789, + 133.41584 ], "boxplot": [ - 3700.174006, - 3700.174006, - 3790.317239, - 3859.741547, - 3859.741547 + 132.321029, + 132.321029, + 133.41584, + 136.279789, + 136.279789 ] }, { "adapter": "datafusion", "values": [ - 698.685422, - 697.732627, - 699.424265 + 93.875846, + 97.435884, + 85.401553 ], "boxplot": [ - 697.732627, - 697.732627, - 698.685422, - 699.424265, - 699.424265 + 85.401553, + 85.401553, + 93.875846, + 97.435884, + 97.435884 ] }, { "adapter": "duckdb", "values": [ - 1329.003731, - 1371.014224, - 1404.765956 + 174.231893, + 170.487822, + 170.825968 ], "boxplot": [ - 1329.003731, - 1329.003731, - 1371.014224, - 1404.765956, - 1404.765956 + 170.487822, + 170.487822, + 170.825968, + 174.231893, + 174.231893 ] }, { "adapter": "pandas", "values": [ - 1036.086833, - 1112.333471, - 1039.571785 + 1074.519474, + 1158.54836, + 1064.291479 ], "boxplot": [ - 1036.086833, - 1036.086833, - 1039.571785, - 1112.333471, - 1112.333471 + 1064.291479, + 1064.291479, + 1074.519474, + 1158.54836, + 1158.54836 ] }, { "adapter": "polars", "values": [ - 227.369517, - 224.182743, - 230.132473 + 226.702083, + 231.724324, + 228.126112 ], "boxplot": [ - 224.182743, - 224.182743, - 227.369517, - 230.132473, - 230.132473 + 226.702083, + 226.702083, + 228.126112, + 231.724324, + 231.724324 ] }, { "adapter": "questdb", "values": [ - 15667.619637, - 15456.403114, - 15356.54979 + 13365.261045, + 13020.719882, + 12894.61415 ], "boxplot": [ - 15356.54979, - 15356.54979, - 15456.403114, - 15667.619637, - 15667.619637 + 12894.61415, + 12894.61415, + 13020.719882, + 13365.261045, + 13365.261045 ] }, { "adapter": "rayforce", "values": [ - 139.766279, - 139.626633, - 136.525734 + 134.642645, + 133.451501, + 133.684225 ], "boxplot": [ - 136.525734, - 136.525734, - 139.626633, - 139.766279, - 139.766279 + 133.451501, + 133.451501, + 133.684225, + 134.642645, + 134.642645 ] }, { "adapter": "timescale", "values": [ - 11720.54785, - 11656.566648, - 11685.364106 + 11657.483562, + 11589.247094, + 11705.787975 ], "boxplot": [ - 11656.566648, - 11656.566648, - 11685.364106, - 11720.54785, - 11720.54785 + 11589.247094, + 11589.247094, + 11657.483562, + 11705.787975, + 11705.787975 ] } ], @@ -2370,121 +2382,121 @@ { "adapter": "chdb", "values": [ - 4333.404806, - 4305.128683, - 4335.124701 + 174.450571, + 182.203326, + 190.579712 ], "boxplot": [ - 4305.128683, - 4305.128683, - 4333.404806, - 4335.124701, - 4335.124701 + 174.450571, + 174.450571, + 182.203326, + 190.579712, + 190.579712 ] }, { "adapter": "datafusion", "values": [ - 732.07084, - 696.903756, - 689.879834 + 110.545288, + 102.736336, + 88.390331 ], "boxplot": [ - 689.879834, - 689.879834, - 696.903756, - 732.07084, - 732.07084 + 88.390331, + 88.390331, + 102.736336, + 110.545288, + 110.545288 ] }, { "adapter": "duckdb", "values": [ - 1599.759109, - 1672.590104, - 1637.421211 + 228.309594, + 215.213534, + 219.499909 ], "boxplot": [ - 1599.759109, - 1599.759109, - 1637.421211, - 1672.590104, - 1672.590104 + 215.213534, + 215.213534, + 219.499909, + 228.309594, + 228.309594 ] }, { "adapter": "pandas", "values": [ - 1334.793094, - 1335.093131, - 1330.213592 + 1362.755713, + 1351.968743, + 1384.425707 ], "boxplot": [ - 1330.213592, - 1330.213592, - 1334.793094, - 1335.093131, - 1335.093131 + 1351.968743, + 1351.968743, + 1362.755713, + 1384.425707, + 1384.425707 ] }, { "adapter": "polars", "values": [ - 334.100324, - 332.310053, - 319.804559 + 339.877397, + 366.209815, + 355.019194 ], "boxplot": [ - 319.804559, - 319.804559, - 332.310053, - 334.100324, - 334.100324 + 339.877397, + 339.877397, + 355.019194, + 366.209815, + 366.209815 ] }, { "adapter": "questdb", "values": [ - 18043.60118, - 17924.925455, - 17905.681355 + 15549.497765, + 15536.930515, + 15482.004985 ], "boxplot": [ - 17905.681355, - 17905.681355, - 17924.925455, - 18043.60118, - 18043.60118 + 15482.004985, + 15482.004985, + 15536.930515, + 15549.497765, + 15549.497765 ] }, { "adapter": "rayforce", "values": [ - 137.802286, - 137.884081, - 138.001466 + 130.954589, + 133.274449, + 131.822446 ], "boxplot": [ - 137.802286, - 137.802286, - 137.884081, - 138.001466, - 138.001466 + 130.954589, + 130.954589, + 131.822446, + 133.274449, + 133.274449 ] }, { "adapter": "timescale", "values": [ - 14118.411912, - 13101.833465, - 13117.115676 + 13480.314015, + 13493.257667, + 13493.746764 ], "boxplot": [ - 13101.833465, - 13101.833465, - 13117.115676, - 14118.411912, - 14118.411912 + 13480.314015, + 13480.314015, + 13493.257667, + 13493.746764, + 13493.746764 ] } ], @@ -2492,121 +2504,121 @@ { "adapter": "chdb", "values": [ - 4385.323614, - 4309.707268, - 4343.175706 + 177.654087, + 171.75997, + 180.547482 ], "boxplot": [ - 4309.707268, - 4309.707268, - 4343.175706, - 4385.323614, - 4385.323614 + 171.75997, + 171.75997, + 177.654087, + 180.547482, + 180.547482 ] }, { "adapter": "datafusion", "values": [ - 701.004051, - 692.506079, - 679.575104 + 95.971798, + 100.719203, + 109.795626 ], "boxplot": [ - 679.575104, - 679.575104, - 692.506079, - 701.004051, - 701.004051 + 95.971798, + 95.971798, + 100.719203, + 109.795626, + 109.795626 ] }, { "adapter": "duckdb", "values": [ - 1576.863896, - 1488.87098, - 1542.86457 + 246.458491, + 237.620904, + 239.067777 ], "boxplot": [ - 1488.87098, - 1488.87098, - 1542.86457, - 1576.863896, - 1576.863896 + 237.620904, + 237.620904, + 239.067777, + 246.458491, + 246.458491 ] }, { "adapter": "pandas", "values": [ - 742.940841, - 904.488061, - 751.5803 + 760.462016, + 923.323884, + 765.282509 ], "boxplot": [ - 742.940841, - 742.940841, - 751.5803, - 904.488061, - 904.488061 + 760.462016, + 760.462016, + 765.282509, + 923.323884, + 923.323884 ] }, { "adapter": "polars", "values": [ - 93.6474, - 170.326369, - 92.420101 + 89.357709, + 177.199253, + 93.644997 ], "boxplot": [ - 92.420101, - 92.420101, - 93.6474, - 170.326369, - 170.326369 + 89.357709, + 89.357709, + 93.644997, + 177.199253, + 177.199253 ] }, { "adapter": "questdb", "values": [ - 17768.090589, - 18054.476508, - 18074.217587 + 15857.665631, + 15685.713258, + 15372.128884 ], "boxplot": [ - 17768.090589, - 17768.090589, - 18054.476508, - 18074.217587, - 18074.217587 + 15372.128884, + 15372.128884, + 15685.713258, + 15857.665631, + 15857.665631 ] }, { "adapter": "rayforce", "values": [ - 127.99291, - 127.8927, - 127.496555 + 132.115353, + 131.093712, + 132.578748 ], "boxplot": [ - 127.496555, - 127.496555, - 127.8927, - 127.99291, - 127.99291 + 131.093712, + 131.093712, + 132.115353, + 132.578748, + 132.578748 ] }, { "adapter": "timescale", "values": [ - 12921.470955, - 12923.243807, - 13055.750353 + 14085.72108, + 13311.392802, + 13165.720948 ], "boxplot": [ - 12921.470955, - 12921.470955, - 12923.243807, - 13055.750353, - 13055.750353 + 13165.720948, + 13165.720948, + 13311.392802, + 14085.72108, + 14085.72108 ] } ], @@ -2614,121 +2626,121 @@ { "adapter": "chdb", "values": [ - 3988.218096, - 4192.862688, - 3987.114517 + 188.298141, + 190.054905, + 202.381915 ], "boxplot": [ - 3987.114517, - 3987.114517, - 3988.218096, - 4192.862688, - 4192.862688 + 188.298141, + 188.298141, + 190.054905, + 202.381915, + 202.381915 ] }, { "adapter": "datafusion", "values": [ - 711.157762, - 697.640789, - 686.268806 + 98.708935, + 103.574957, + 108.005767 ], "boxplot": [ - 686.268806, - 686.268806, - 697.640789, - 711.157762, - 711.157762 + 98.708935, + 98.708935, + 103.574957, + 108.005767, + 108.005767 ] }, { "adapter": "duckdb", "values": [ - 1391.284333, - 1536.190408, - 1522.447843 + 226.928453, + 234.846354, + 231.098126 ], "boxplot": [ - 1391.284333, - 1391.284333, - 1522.447843, - 1536.190408, - 1536.190408 + 226.928453, + 226.928453, + 231.098126, + 234.846354, + 234.846354 ] }, { "adapter": "pandas", "values": [ - 1545.522189, - 1587.628757, - 1577.257524 + 1580.391056, + 1613.520633, + 1623.014567 ], "boxplot": [ - 1545.522189, - 1545.522189, - 1577.257524, - 1587.628757, - 1587.628757 + 1580.391056, + 1580.391056, + 1613.520633, + 1623.014567, + 1623.014567 ] }, { "adapter": "polars", "values": [ - 365.746551, - 469.305043, - 471.597734 + 485.287317, + 465.343039, + 461.885906 ], "boxplot": [ - 365.746551, - 365.746551, - 469.305043, - 471.597734, - 471.597734 + 461.885906, + 461.885906, + 465.343039, + 485.287317, + 485.287317 ] }, { "adapter": "questdb", "values": [ - 18053.401985, - 17864.984809, - 17933.876613 + 16414.656882, + 16032.972385, + 15993.333055 ], "boxplot": [ - 17864.984809, - 17864.984809, - 17933.876613, - 18053.401985, - 18053.401985 + 15993.333055, + 15993.333055, + 16032.972385, + 16414.656882, + 16414.656882 ] }, { "adapter": "rayforce", "values": [ - 125.015594, - 124.704141, - 124.051939 + 128.442776, + 129.174564, + 135.760011 ], "boxplot": [ - 124.051939, - 124.051939, - 124.704141, - 125.015594, - 125.015594 + 128.442776, + 128.442776, + 129.174564, + 135.760011, + 135.760011 ] }, { "adapter": "timescale", "values": [ - 14211.103895, - 13812.678675, - 13876.999323 + 14279.013058, + 14272.05577, + 14396.924957 ], "boxplot": [ - 13812.678675, - 13812.678675, - 13876.999323, - 14211.103895, - 14211.103895 + 14272.05577, + 14272.05577, + 14279.013058, + 14396.924957, + 14396.924957 ] } ], @@ -2736,121 +2748,121 @@ { "adapter": "chdb", "values": [ - 5653.989488, - 5801.309711, - 5639.881957 + 1769.310978, + 1676.37437, + 1658.92861 ], "boxplot": [ - 5639.881957, - 5639.881957, - 5653.989488, - 5801.309711, - 5801.309711 + 1658.92861, + 1658.92861, + 1676.37437, + 1769.310978, + 1769.310978 ] }, { "adapter": "datafusion", "values": [ - 1170.396308, - 1175.326223, - 1170.202257 + 814.229999, + 823.296592, + 837.814985 ], "boxplot": [ - 1170.202257, - 1170.202257, - 1170.396308, - 1175.326223, - 1175.326223 + 814.229999, + 814.229999, + 823.296592, + 837.814985, + 837.814985 ] }, { "adapter": "duckdb", "values": [ - 2556.180977, - 2180.211371, - 2474.130783 + 625.502572, + 633.510744, + 606.074179 ], "boxplot": [ - 2180.211371, - 2180.211371, - 2474.130783, - 2556.180977, - 2556.180977 + 606.074179, + 606.074179, + 625.502572, + 633.510744, + 633.510744 ] }, { "adapter": "pandas", "values": [ - 7477.973602, - 7524.296472, - 7494.925995 + 7497.027246, + 7558.863074, + 7678.428811 ], "boxplot": [ - 7477.973602, - 7477.973602, - 7494.925995, - 7524.296472, - 7524.296472 + 7497.027246, + 7497.027246, + 7558.863074, + 7678.428811, + 7678.428811 ] }, { "adapter": "polars", "values": [ - 876.208715, - 841.818671, - 865.532423 + 883.113051, + 871.452791, + 893.866463 ], "boxplot": [ - 841.818671, - 841.818671, - 865.532423, - 876.208715, - 876.208715 + 871.452791, + 871.452791, + 883.113051, + 893.866463, + 893.866463 ] }, { "adapter": "questdb", "values": [ - 40168.715816, - 40189.311438, - 40835.013604 + 36976.122859, + 37404.923365, + 37507.763661 ], "boxplot": [ - 40168.715816, - 40168.715816, - 40189.311438, - 40835.013604, - 40835.013604 + 36976.122859, + 36976.122859, + 37404.923365, + 37507.763661, + 37507.763661 ] }, { "adapter": "rayforce", "values": [ - 317.918915, - 314.945439, - 316.303236 + 324.349827, + 329.414139, + 323.380025 ], "boxplot": [ - 314.945439, - 314.945439, - 316.303236, - 317.918915, - 317.918915 + 323.380025, + 323.380025, + 324.349827, + 329.414139, + 329.414139 ] }, { "adapter": "timescale", "values": [ - 26804.356056, - 26007.561612, - 26048.01391 + 27650.273433, + 26488.992098, + 25996.828063 ], "boxplot": [ - 26007.561612, - 26007.561612, - 26048.01391, - 26804.356056, - 26804.356056 + 25996.828063, + 25996.828063, + 26488.992098, + 27650.273433, + 27650.273433 ] } ], @@ -2858,121 +2870,121 @@ { "adapter": "chdb", "values": [ - 5627.522778, - 5769.391011, - 5539.862483 + 5437.768278, + 5407.47953, + 5529.024596 ], "boxplot": [ - 5539.862483, - 5539.862483, - 5627.522778, - 5769.391011, - 5769.391011 + 5407.47953, + 5407.47953, + 5437.768278, + 5529.024596, + 5529.024596 ] }, { "adapter": "datafusion", "values": [ - 2099.87382, - 2085.394963, - 2094.198292 + 2119.790408, + 2229.318302, + 2318.703137 ], "boxplot": [ - 2085.394963, - 2085.394963, - 2094.198292, - 2099.87382, - 2099.87382 + 2119.790408, + 2119.790408, + 2229.318302, + 2318.703137, + 2318.703137 ] }, { "adapter": "duckdb", "values": [ - 5844.444768, - 6019.749889, - 5836.241452 + 1177.61354, + 1159.718102, + 1143.129957 ], "boxplot": [ - 5836.241452, - 5836.241452, - 5844.444768, - 6019.749889, - 6019.749889 + 1143.129957, + 1143.129957, + 1159.718102, + 1177.61354, + 1177.61354 ] }, { "adapter": "pandas", "values": [ - 8870.207739, - 8956.919848, - 8536.641854 + 9027.167991, + 8341.50787, + 8458.088126 ], "boxplot": [ - 8536.641854, - 8536.641854, - 8870.207739, - 8956.919848, - 8956.919848 + 8341.50787, + 8341.50787, + 8458.088126, + 9027.167991, + 9027.167991 ] }, { "adapter": "polars", "values": [ - 1929.284059, - 1971.37774, - 1839.395871 + 2078.115573, + 1983.182276, + 1960.174071 ], "boxplot": [ - 1839.395871, - 1839.395871, - 1929.284059, - 1971.37774, - 1971.37774 + 1960.174071, + 1960.174071, + 1983.182276, + 2078.115573, + 2078.115573 ] }, { "adapter": "questdb", "values": [ - 21314.318914, - 21478.816214, - 21468.560059 + 20812.126651, + 21165.373496, + 21178.815081 ], "boxplot": [ - 21314.318914, - 21314.318914, - 21468.560059, - 21478.816214, - 21478.816214 + 20812.126651, + 20812.126651, + 21165.373496, + 21178.815081, + 21178.815081 ] }, { "adapter": "rayforce", "values": [ - 258.873734, - 258.418033, - 258.755638 + 266.08366, + 266.632949, + 264.067293 ], "boxplot": [ - 258.418033, - 258.418033, - 258.755638, - 258.873734, - 258.873734 + 264.067293, + 264.067293, + 266.08366, + 266.632949, + 266.632949 ] }, { "adapter": "timescale", "values": [ - 21712.408413, - 22296.467962, - 22120.174409 + 22936.383768, + 23422.355385, + 22809.6371 ], "boxplot": [ - 21712.408413, - 21712.408413, - 22120.174409, - 22296.467962, - 22296.467962 + 22809.6371, + 22809.6371, + 22936.383768, + 23422.355385, + 23422.355385 ] } ], @@ -2980,121 +2992,121 @@ { "adapter": "chdb", "values": [ - 2431.082903, - 2390.842804, - 2332.272477 + 569.424375, + 546.844065, + 537.208057 ], "boxplot": [ - 2332.272477, - 2332.272477, - 2390.842804, - 2431.082903, - 2431.082903 + 537.208057, + 537.208057, + 546.844065, + 569.424375, + 569.424375 ] }, { "adapter": "datafusion", "values": [ - 1286.185314, - 1263.511666, - 1232.509941 + 1040.708312, + 1039.608403, + 1132.460303 ], "boxplot": [ - 1232.509941, - 1232.509941, - 1263.511666, - 1286.185314, - 1286.185314 + 1039.608403, + 1039.608403, + 1040.708312, + 1132.460303, + 1132.460303 ] }, { "adapter": "duckdb", "values": [ - 1802.66877, - 1778.499478, - 1828.361851 + 359.759423, + 365.860585, + 346.242137 ], "boxplot": [ - 1778.499478, - 1778.499478, - 1802.66877, - 1828.361851, - 1828.361851 + 346.242137, + 346.242137, + 359.759423, + 365.860585, + 365.860585 ] }, { "adapter": "pandas", "values": [ - 9103.882391, - 10083.191178, - 9536.816694 + 9571.246642, + 9310.505637, + 9633.060745 ], "boxplot": [ - 9103.882391, - 9103.882391, - 9536.816694, - 10083.191178, - 10083.191178 + 9310.505637, + 9310.505637, + 9571.246642, + 9633.060745, + 9633.060745 ] }, { "adapter": "polars", "values": [ - 574.412754, - 565.545102, - 559.373149 + 712.479347, + 600.401362, + 594.931644 ], "boxplot": [ - 559.373149, - 559.373149, - 565.545102, - 574.412754, - 574.412754 + 594.931644, + 594.931644, + 600.401362, + 712.479347, + 712.479347 ] }, { "adapter": "questdb", "values": [ - 17599.980769, - 17787.792404, - 17706.632356 + 17023.903595, + 16907.407046, + 16624.047288 ], "boxplot": [ - 17599.980769, - 17599.980769, - 17706.632356, - 17787.792404, - 17787.792404 + 16624.047288, + 16624.047288, + 16907.407046, + 17023.903595, + 17023.903595 ] }, { "adapter": "rayforce", "values": [ - 81.59528, - 79.416197, - 79.849295 + 86.990622, + 87.386538, + 86.490287 ], "boxplot": [ - 79.416197, - 79.416197, - 79.849295, - 81.59528, - 81.59528 + 86.490287, + 86.490287, + 86.990622, + 87.386538, + 87.386538 ] }, { "adapter": "timescale", "values": [ - 12756.82508, - 12758.780267, - 13378.647656 + 13148.022207, + 13092.980246, + 12942.124823 ], "boxplot": [ - 12756.82508, - 12756.82508, - 12758.780267, - 13378.647656, - 13378.647656 + 12942.124823, + 12942.124823, + 13092.980246, + 13148.022207, + 13148.022207 ] } ] @@ -3157,7 +3169,7 @@ "pandas": "df.groupby([\"id4\",\"id5\"], as_index=False).agg(v3_median=(\"v3\",\"median\"), v3_std=(\"v3\",\"std\"))", "polars": "df.group_by(\"id4\",\"id5\").agg(pl.median(\"v3\"), pl.std(\"v3\"))", "questdb": "-- NYI: QuestDB has no exact median(); only approx_median", - "rayforce": "# NYI: rayforce engine does not support median + multi-key by()", + "rayforce": "t.select(v3_median=Column(\"v3\").median(), v3_std=Column(\"v3\").std()).by(\"id4\",\"id5\").execute()", "timescale": "SELECT id4, id5, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY v3), STDDEV_SAMP(v3) FROM data GROUP BY id4, id5" }, "groupby_q7": { @@ -3177,7 +3189,7 @@ "pandas": "df.dropna(subset=[\"v3\"]).sort_values(\"v3\", ascending=False).groupby(\"id6\").head(2)", "polars": "df.drop_nulls(\"v3\").sort(\"v3\", descending=True).group_by(\"id6\").agg(pl.col(\"v3\").head(2).alias(\"largest2_v3\")).explode(\"largest2_v3\")", "questdb": "SELECT id6, v3 FROM (SELECT id6, v3, row_number() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) WHERE rn <= 2", - "rayforce": "# NYI: rayforce-py has no top-N / per-group head(n)", + "rayforce": "t.select(largest2_v3=Column(\"v3\").top(2)).by(\"id6\").execute()", "timescale": "SELECT id6, v3 FROM (SELECT id6, v3, ROW_NUMBER() OVER (PARTITION BY id6 ORDER BY v3 DESC) rn FROM data WHERE v3 IS NOT NULL) sub WHERE rn <= 2" }, "groupby_q9": { @@ -3187,7 +3199,7 @@ "pandas": "df.groupby([\"id2\",\"id4\"]).apply(lambda g: g[\"v1\"].corr(g[\"v2\"]) ** 2)", "polars": "df.group_by(\"id2\",\"id4\").agg((pl.corr(\"v1\",\"v2\")**2).alias(\"r2\"))", "questdb": "SELECT id2, id4, POWER(corr(v1, v2), 2) FROM data GROUP BY id2, id4", - "rayforce": "# NYI: rayforce-py has no Column.corr / pearson_corr", + "rayforce": "# Two-stage: pearson_corr at top first, then square the result\nagg = t.select(r=Column(\"v1\").pearson_corr(Column(\"v2\"))).by(\"id2\",\"id4\").execute()\nagg.select(\"id2\", \"id4\", r2=Column(\"r\")*Column(\"r\")).execute()", "timescale": "SELECT id2, id4, POWER(CORR(v1, v2), 2) FROM data GROUP BY id2, id4" }, "groupby_q10": { diff --git a/docs/histogram.html b/docs/histogram.html index e018d33..e579da4 100644 --- a/docs/histogram.html +++ b/docs/histogram.html @@ -1,49 +1,31 @@ RayforceDB H2O Benchmark - +

RayforceDB H2O Benchmark

-

Group-by (q1–q7)

-
-

Joins, sorts & heavy group-by (q8–q10)

-
+
+}); + \ No newline at end of file diff --git a/docs/scaling.html b/docs/scaling.html index b44cb21..3265e87 100644 --- a/docs/scaling.html +++ b/docs/scaling.html @@ -71,7 +71,7 @@

Operations