Skip to content

Perf: Take the comparison-free fast path in the grouped first/last accumulator when input is pre-ordered - #25050

Merged
comphead merged 5 commits into
apache:mainfrom
zhuqi-lucas:first-last-preordered-fastpath
Sep 10, 2026
Merged

comphead merged 5 commits into
apache:mainfrom
zhuqi-lucas:first-last-preordered-fastpath

Conversation

@zhuqi-lucas

@zhuqi-lucas zhuqi-lucas commented Sep 8, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Closes #24771.

Rationale for this change

OptimizeAggregateOrder already proves, via with_beneficial_ordering, when the input
ordering satisfies the group-by prefix followed by a first_value/last_value ordering
requirement, and the single-group accumulators consume that flag (first_last.rs,
get_first_idx/get_last_idx). The grouped path never did: create_groups_accumulator
dropped the flag, and FirstLastGroupsAccumulator ran the full per-row lexicographic
tournament, per-winner ordering-key materialization, and cross-batch compare_rows on
every batch even though the winner was already determined by position.

The motivating workload (a materialized GROUP BY date, ticker with three
LAST_VALUE(... ORDER BY ts, seq) over an NBBO table whose file sort order is exactly
(ticker, ts, seq), ~1.5B rows/day, ~1.8M groups) spends ~20% of on-CPU time inside
get_filtered_extreme_of_each_group — all of it avoidable comparisons. The same
ordering evidence is cashed twice by the planner but only once by the executor.

What changes are included in this PR?

  • is_input_pre_ordered is threaded through create_groups_accumulator into
    FirstLastGroupsAccumulator.
  • When set, update_batch takes a comparison-free path: one pass over group_indices
    records each group's first (FIRST_VALUE) or last (LAST_VALUE) qualifying row; later
    batches unconditionally overwrite for LAST_VALUE and never overwrite for FIRST_VALUE.
    No LexicographicalComparator is built and compare_rows never runs on this path.
  • The winner's ordering values are still materialized into the partial state: the final
    stage merges states from partitions whose relative arrival order is not guaranteed, so
    merge_batch keeps comparing and is intentionally untouched, as are
    convert_to_state and the skip-partial is_set handling.
  • Drive-by: three stale comments still referring to the field's old name
    (min_of_each_group_buf) are updated.

Tie semantics note: among rows whose ordering keys compare equal, this path picks
the physically last qualifying row for LAST_VALUE (first for FIRST_VALUE), matching the
single-group pre-ordered accumulator and Iterator::max_by. The tournament path keeps
the first-seen row of a tie (its comparisons are strict), so the two paths may pick
different — equally valid — rows on tied keys. Documented on the method and pinned by a
dedicated test.

Are these changes tested?

  • 9 new unit tests: fast-vs-tournament full-state equivalence (LAST/FIRST/DESC/FILTER
    incl. null predicates/IGNORE NULLS/RESPECT NULLS with a null winner), explicit
    expected values, EmitTo::First(n) mid-stream draining with index shifting, and a
    partial→final merge in both arrival orders proving the emitted state carries the
    winning ordering keys.
  • A new end-to-end first_last_ordered.slt: requirement proven through declared
    orderings, through a projection-alias equivalence, and through a filter-induced
    constant; FILTER interaction; and the reverse branch (FIRST over DESC).
  • Existing suites pass: 215 crate tests, aggregate.slt, first_last_nested.slt,
    group_by.slt, distinct_on.slt, array_agg.slt, subquery_sort.slt.

Are there any user-facing changes?

No API changes. Queries whose input ordering already satisfies a grouped
first_value/last_value requirement get faster; on the motivating workload the
aggregation stage improved by ~20% end-to-end wall time.

User-visible behavior change: tie handling

Among rows whose ordering keys compare equal, the pre-ordered fast path picks
the physically last qualifying row for LAST_VALUE (and the physically
first for FIRST_VALUE), matching the single-group pre-ordered accumulator
and Iterator::max_by. The grouped tournament path keeps the first-seen
row of a tie (its comparisons are strict). Which row of a tie wins is
unspecified, but declaring WITH ORDER on a table can now change which one a
query returns. Pinned by a dedicated tied-keys case in
first_last_ordered.slt; release notes should carry one line for this.

Grouping sets

OptimizeAggregateOrder no longer uses the GROUP BY prefix to prove the
aggregate's requirement when grouping sets are present: the stream feeds the
same rows once per grouping set, and within a coarser set's group the rows
follow the full group-by prefix rather than the aggregate's own ORDER BY.
This also fixes a latent wrong-results path that existed on main: the
single-group accumulators consumed the flag through GroupsAccumulatorAdapter
for types outside groups_accumulator_supported (e.g. Boolean). Covered by
ROLLUP slt cases (including a Boolean one that exercises the adapter path) and
two rule-level unit tests.

Fast-path complexity

Winner collection and the scoreboard reset in update_batch_pre_ordered are
O(groups touched by the batch), not O(total_num_groups): touched group
indices are recorded on the false-to-true scoreboard transition and only those
slots are visited and cleared. A spill replay interleaves merge_batch (which
leaves scoreboard bits set) with update_batch on the same accumulator
instance, so a dirty flag triggers one full reset in that case; covered by a
merge-interleave unit test and a sparse-1M-groups test.

Fuzzing

The aggregation fuzzer now draws first/last ORDER BYs from a prefix of the
dataset's sort keys half of the time, so sorted datasets exercise the fast
path while the unsorted dataset runs the comparing path on the same query.
The aggregate argument is the last ORDER BY column so ties carry equal output
values and the tie-break difference above cannot cause false mismatches.

Benchmarks for the pre-ordered path (group-count / rows-per-group / null /
filter sweeps) land in a separate bench-only PR so before/after numbers can be
taken on main.

…tor when input is pre-ordered

OptimizeAggregateOrder already proves, via with_beneficial_ordering, when the
input ordering satisfies the group-by prefix followed by a first_value/
last_value ordering requirement, and the single-group accumulators consume
that flag — but the grouped path never did: create_groups_accumulator dropped
it, and FirstLastGroupsAccumulator ran the full per-row lexicographic
tournament, per-winner ordering-key boxing, and cross-batch compare_rows on
every batch even though the winner was already determined by position.

Thread is_input_pre_ordered through create_groups_accumulator into
FirstLastGroupsAccumulator, and when set, replace the tournament in
update_batch with a single pass over group_indices: the first (FIRST_VALUE)
or last (LAST_VALUE) qualifying row of each group in the batch wins, later
batches unconditionally overwrite for LAST_VALUE and never overwrite for
FIRST_VALUE. No LexicographicalComparator is built and compare_rows never
runs on this path.

The winning row's ordering values are still materialized into the partial
state: the final aggregation stage merges states from partitions whose
relative arrival order is not guaranteed, so merge_batch keeps comparing and
is intentionally untouched, as are convert_to_state and the skip-partial
is_set handling.

Closes apache#24771
Copilot AI lite review requested due to automatic review settings September 8, 2026 06:00
@github-actions github-actions Bot added sqllogictest SQL Logic Tests (.slt) functions Changes to functions implementation labels Sep 8, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The newly added sqllogictest file appears to reference window_2.csv using an incorrect relative LOCATION path, likely causing test failures.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Improves performance of grouped first_value/last_value aggregates by honoring optimizer-proven beneficial input ordering, enabling a comparison-free update path while preserving correct partial-state merge behavior.

Changes:

  • Thread is_input_pre_ordered through grouped accumulator creation and add a fast path in FirstLastGroupsAccumulator::update_batch to avoid per-row comparisons when input is pre-ordered.
  • Add extensive unit tests covering fast-path correctness (including FILTER/NULLS/ties/partial emits) and partial→final merge correctness.
  • Add an end-to-end sqllogictest (first_last_ordered.slt) to validate optimizer→executor propagation of the pre-ordered optimization.
File summaries
File Description
datafusion/sqllogictest/test_files/first_last_ordered.slt Adds end-to-end coverage for grouped ordered first/last fast path via declared orderings and optimizer-driven proofs.
datafusion/functions-aggregate/src/first_last.rs Threads the pre-ordered flag into grouped accumulators and implements a comparison-free update_batch path with added unit tests.
Review details
  • Files reviewed: 2/2 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread datafusion/sqllogictest/test_files/first_last_ordered.slt Outdated
@zhuqi-lucas zhuqi-lucas changed the title Take the comparison-free fast path in the grouped first/last accumulator when input is pre-ordered Perf: Take the comparison-free fast path in the grouped first/last accumulator when input is pre-ordered Sep 8, 2026
@zhuqi-lucas zhuqi-lucas added the performance Make DataFusion faster label Sep 8, 2026
@codecov-commenter

codecov-commenter commented Sep 8, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 82.46073% with 67 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.74%. Comparing base (a5c809f) to head (184bb56).
⚠️ Report is 9 commits behind head on main.

Files with missing lines Patch % Lines
datafusion/functions-aggregate/src/first_last.rs 82.11% 3 Missing and 63 partials ⚠️
...fusion/physical-optimizer/src/update_aggr_exprs.rs 92.30% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main   #25050    +/-   ##
========================================
  Coverage   81.74%   81.74%            
========================================
  Files        1128     1128            
  Lines      416644   417152   +508     
  Branches   416644   417152   +508     
========================================
+ Hits       340592   341016   +424     
- Misses      55995    56003     +8     
- Partials    20057    20133    +76     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@jayzhan211 jayzhan211 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @zhuqi-lucas , here is a suggestion:

The fast path is sound for a single grouping set, but OptimizeAggregateOrder sets the flag for grouping sets too, and there the guarantee does not hold. group_expr().input_exprs() for ROLLUP(a, b) is [a, b], so an input ordered (a, b, c) satisfies [a, b, c ASC] and with_beneficial_ordering(true) is applied. GroupedHashAggregateStream then calls update_batch once per grouping set, and for the (a) set the rows of group a=1 arrive in (b, c) order, not c order. The tournament path tolerated that; the positional path does not.

Repro on this branch (target_partitions=1, CSV declared WITH ORDER (a ASC, b ASC, c ASC), rows (1,1,5,100) (1,1,6,101) (1,2,1,200) (1,2,2,201)):

SELECT a, b, FIRST_VALUE(d ORDER BY c), LAST_VALUE(d ORDER BY c)
FROM t GROUP BY ROLLUP(a, b) ORDER BY a NULLS FIRST, b NULLS FIRST;

expected            actual
NULL NULL 200 101   NULL NULL 100 201
1    NULL 200 101   1    NULL 100 201
1    1    100 101   1    1    100 101
1    2    200 201   1    2    200 201

main is fine because the grouped accumulator ignored the flag. The single-group accumulator (used through GroupsAccumulatorAdapter for types outside groups_accumulator_supported) has had the same latent issue, so I'd fix it in the rule rather than in the accumulator. With grouping sets, drop the group-by prefix and require the aggregate's own ORDER BY to be satisfied on its own; a globally sorted input stays sorted in every subsequence, so the fast path is still taken in that case:

--- a/datafusion/physical-optimizer/src/update_aggr_exprs.rs
+++ b/datafusion/physical-optimizer/src/update_aggr_exprs.rs
@@
-                let groupby_exprs = aggr_exec.group_expr().input_exprs();
-                // If the existing ordering satisfies a prefix of the GROUP BY
-                // expressions, prefix requirements with this section. In this
-                // case, aggregation will work more efficiently.
-                let indices = get_ordered_partition_by_indices(&groupby_exprs, input)?;
-                let requirement = indices
-                    .iter()
-                    .map(|&idx| {
-                        PhysicalSortRequirement::new(
-                            Arc::clone(&groupby_exprs[idx]),
-                            None,
-                        )
-                    })
-                    .collect::<Vec<_>>();
+                // With grouping sets the same rows are fed once per grouping
+                // set, and a coarser set's group is only ordered by the
+                // aggregate's ORDER BY if the input is ordered by it without
+                // any group-by prefix. So only use the prefix for a single
+                // grouping set.
+                let requirement = if aggr_exec.group_expr().is_single() {
+                    let groupby_exprs = aggr_exec.group_expr().input_exprs();
+                    let indices =
+                        get_ordered_partition_by_indices(&groupby_exprs, input)?;
+                    indices
+                        .iter()
+                        .map(|&idx| {
+                            PhysicalSortRequirement::new(
+                                Arc::clone(&groupby_exprs[idx]),
+                                None,
+                            )
+                        })
+                        .collect::<Vec<_>>()
+                } else {
+                    vec![]
+                };

Please also add the ROLLUP query above to first_last_ordered.slt so this stays covered.

…ping set

With grouping sets the stream feeds the same rows once per grouping set,
and within a coarser set's group the rows follow the full group-by prefix,
not the aggregate's own ORDER BY. Proving the prefixed requirement there
marked first/last aggregates as pre-ordered when their groups were not,
which the new grouped fast path (and the single-group accumulator through
GroupsAccumulatorAdapter, latently on main) turned into wrong results.

Suggested by @jayzhan211 in review, with the ROLLUP reproduction now
covered in first_last_ordered.slt alongside a grouping-set case that
legitimately keeps the fast path.
@zhuqi-lucas

zhuqi-lucas commented Sep 8, 2026 •

Copy link
Copy Markdown
Contributor Author

Thank you @jayzhan211 — confirmed, and great catch. I reproduced your ROLLUP example on this branch before touching anything (wrong results exactly as you showed), then applied the fix in OptimizeAggregateOrder as you suggested: the group-by prefix is only used for a single grouping set, so with grouping sets the aggregate's own ORDER BY must be satisfied on its own. Your repro now returns the expected rows.

Added two cases to first_last_ordered.slt:

  • your ROLLUP repro (comparisons required, correct results), and
  • a ROLLUP where the aggregate ORDER BY leads the input ordering, which stays on the fast path since a globally sorted input is sorted within every group of every grouping set.

Also worth noting for reviewers: as you said, the single-group accumulator consumed this flag through GroupsAccumulatorAdapter on main already, so the rule-level guard fixes that latent path too, not just the new grouped fast path.

@github-actions github-actions Bot added the optimizer Optimizer rules label Sep 8, 2026

@comphead comphead left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @zhuqi-lucas I had a quick LLM review first

Blockers

  1. LAST_VALUE tie-break. The fast path takes the last row of a tie, the tournament takes the first (verified: tournament 10, fast 12 within a batch, 10 vs 20 across batches). At SQL level, adding WITH ORDER (ts ASC) to a table flips LAST_VALUE(px ORDER BY ts) from 10,20 to 11,21. Not fixable without comparisons, so: document it as a user-visible behavior change in the PR description and release notes, not just a code comment. Add an SLT case with a tied ordering key.

  2. Split out the is_single() gate, or at least test it where it bites. It fixes a wrong-results bug that exists on main today via GroupsAccumulatorAdapter (Boolean is not in groups_accumulator_supported). Add:

    • a Boolean-valued ROLLUP SLT case (the current INT d case is already correct on main, so it only covers the new fast path)
    • a update_aggr_exprs.rs unit test asserting the flag is not set under grouping sets
    • ideally a separate PR so it can be backported

Should fix in this PR

  1. Collect winners in O(rows), not O(total_num_groups). Push group_idx into a reusable Vec field on the false-to-true transition of the scoreboard bit, and clear only those slots on reset. Measured: at 8192 rows and 64 touched groups the fast path is 1.99x, but raising total_num_groups to 1M takes it from 12.71 to 414.66 us/batch and collapses the speedup to 1.04x. Both regimes set the flag.

  2. Extend benches/first_last.rs. Add a pre_ordered flag to prepare_typed_groups_accumulator via with_beneficial_ordering(true). Sweep total_num_groups, rows per group, null density, filter on and off, and one bytes or nested type.

  3. Give the fuzzer a path that actually reaches the fast path. Today the generated ORDER BY takes min(12, 43) columns with random directions against sort keys of at most 3, so it never triggers. Draw the aggregate ORDER BY from the dataset's sort_keys and compare against the non-hinted plan. Item 1 must be settled first, since the baseline uses the tournament tie-break and comparison is exact.

@zhuqi-lucas

zhuqi-lucas commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor Author

Thanks @comphead — all five addressed; per-item notes:

  1. Tie-break: documented as a user-visible behavior change in the PR description (new section) and pinned by a tied-keys case in first_last_ordered.slt. Release-notes line suggested there too.
  2. is_single gate coverage: added a Boolean ROLLUP slt case (Boolean is outside groups_accumulator_supported, so it exercises the GroupsAccumulatorAdapter path that consumed the flag on main), plus two rule-level unit tests in core/tests/physical_optimizer/update_aggr_exprs.rs asserting the flag is set for a single grouping set and not set under grouping sets. Kept in this PR for now — happy to split it out for backporting if maintainers prefer.
  3. O(rows) winners: update_batch_pre_ordered now records touched groups on the scoreboard's false-to-true transition and visits/clears only those. One wrinkle found while doing it: spill replay calls merge_batch on the same accumulator instance and the tournament helper leaves its winners' bits set, so a dirty flag triggers one full reset in that case — covered by a merge-interleave test and a sparse-1M-groups test.
  4. Benches: split into a separate bench-only PR (coming next) so before/after numbers can be taken on main first.
  5. Fuzzer: first/last ORDER BYs are now drawn from a prefix of the dataset's sort keys half the time, so the sorted datasets exercise the fast path while the unsorted dataset runs the comparing path on the same query. To keep the comparison exact despite item 1, the aggregate argument is the last ORDER BY column: rows tying on the whole ORDER BY carry equal output values, so the tie-break difference cannot produce false mismatches. test_first_val/test_last_val pass with the new mode.

…zz the fast path

- update_batch_pre_ordered records touched groups on the scoreboard's
  false-to-true transition and visits/clears only those, instead of
  scanning total_num_groups per batch; a dirty flag handles merge_batch
  (spill replay) interleaving on the same instance, which leaves winners'
  bits set. Covered by a sparse-1M-groups test and a merge-interleave test.
- Tie handling is documented as a user-visible behavior change in the PR
  description and pinned by a tied-keys slt case.
- The grouping-sets guard gets rule-level unit tests (flag set for a single
  grouping set, not set under grouping sets) and a Boolean ROLLUP slt case
  that exercises the GroupsAccumulatorAdapter path, which consumed the flag
  on main already.
- The aggregation fuzzer draws first/last ORDER BYs from a prefix of the
  dataset's sort keys half the time, so sorted datasets exercise the fast
  path against the unsorted dataset's comparing path; the argument is the
  last ORDER BY column so ties carry equal outputs and the documented
  tie-break difference cannot produce false mismatches.

Benchmarks for the pre-ordered path land in a separate bench-only PR.
@github-actions github-actions Bot added the core Core DataFusion crate label Sep 9, 2026
@comphead

comphead commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

run benchmark tpch tpcds

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5604112081-2268-cg42r 6.12.94+ #1 SMP Fri Jul 17 09:42:57 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing first-last-preordered-fastpath (184bb56) to a5c809f (merge-base) diff

Run configuration
run benchmark tpch

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5604112081-2269-bfp9q 6.12.94+ #1 SMP Fri Jul 17 09:42:57 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing first-last-preordered-fastpath (184bb56) to a5c809f (merge-base) diff

Run configuration
run benchmark tpcds

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing first-last-preordered-fastpath (184bb56) to a5c809f (merge-base) diff

Run configuration
run benchmark tpch
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and first-last-preordered-fastpath
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃     HEAD ┃ first-last-preordered-fastpath ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │ 40.41 ms │                       37.73 ms │ +1.07x faster │
│ QQuery 2  │ 20.07 ms │                       18.70 ms │ +1.07x faster │
│ QQuery 3  │ 30.88 ms │                       28.22 ms │ +1.09x faster │
│ QQuery 4  │ 19.03 ms │                       17.40 ms │ +1.09x faster │
│ QQuery 5  │ 39.61 ms │                       34.81 ms │ +1.14x faster │
│ QQuery 6  │ 17.19 ms │                       15.99 ms │ +1.08x faster │
│ QQuery 7  │ 46.62 ms │                       40.45 ms │ +1.15x faster │
│ QQuery 8  │ 42.67 ms │                       40.68 ms │     no change │
│ QQuery 9  │ 49.09 ms │                       48.51 ms │     no change │
│ QQuery 10 │ 41.90 ms │                       41.73 ms │     no change │
│ QQuery 11 │ 13.51 ms │                       13.33 ms │     no change │
│ QQuery 12 │ 23.79 ms │                       23.83 ms │     no change │
│ QQuery 13 │ 39.15 ms │                       39.26 ms │     no change │
│ QQuery 14 │ 24.34 ms │                       24.09 ms │     no change │
│ QQuery 15 │ 32.19 ms │                       30.31 ms │ +1.06x faster │
│ QQuery 16 │ 14.60 ms │                       13.71 ms │ +1.06x faster │
│ QQuery 17 │ 77.14 ms │                       69.04 ms │ +1.12x faster │
│ QQuery 18 │ 62.56 ms │                       59.65 ms │     no change │
│ QQuery 19 │ 33.43 ms │                       32.26 ms │     no change │
│ QQuery 20 │ 31.99 ms │                       30.79 ms │     no change │
│ QQuery 21 │ 55.91 ms │                       54.34 ms │     no change │
│ QQuery 22 │ 13.69 ms │                       13.92 ms │     no change │
└───────────┴──────────┴────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                             ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                             │ 769.79ms │
│ Total Time (first-last-preordered-fastpath)   │ 728.76ms │
│ Average Time (HEAD)                           │  34.99ms │
│ Average Time (first-last-preordered-fastpath) │  33.13ms │
│ Queries Faster                                │       10 │
│ Queries Slower                                │        0 │
│ Queries with No Change                        │       12 │
│ Queries with Failure                          │        0 │
└───────────────────────────────────────────────┴──────────┘

Distribution per query (min / mean ±stddev / max):

Comparing HEAD and first-last-preordered-fastpath
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃ first-last-preordered-fastpath ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │ 40.41 / 42.30 ±1.49 / 43.76 ms │ 37.73 / 38.68 ±1.07 / 40.75 ms │ +1.09x faster │
│ QQuery 2  │ 20.07 / 20.50 ±0.35 / 21.11 ms │ 18.70 / 19.65 ±0.65 / 20.23 ms │     no change │
│ QQuery 3  │ 30.88 / 31.21 ±0.27 / 31.56 ms │ 28.22 / 28.62 ±0.32 / 29.05 ms │ +1.09x faster │
│ QQuery 4  │ 19.03 / 19.62 ±0.71 / 20.56 ms │ 17.40 / 17.46 ±0.07 / 17.57 ms │ +1.12x faster │
│ QQuery 5  │ 39.61 / 40.47 ±1.18 / 42.79 ms │ 34.81 / 35.32 ±0.33 / 35.74 ms │ +1.15x faster │
│ QQuery 6  │ 17.19 / 17.48 ±0.33 / 18.11 ms │ 15.99 / 16.10 ±0.06 / 16.14 ms │ +1.09x faster │
│ QQuery 7  │ 46.62 / 48.30 ±1.16 / 50.00 ms │ 40.45 / 42.19 ±1.30 / 43.82 ms │ +1.14x faster │
│ QQuery 8  │ 42.67 / 43.58 ±0.53 / 44.26 ms │ 40.68 / 42.06 ±2.07 / 46.17 ms │     no change │
│ QQuery 9  │ 49.09 / 50.41 ±1.06 / 52.20 ms │ 48.51 / 49.93 ±0.95 / 51.27 ms │     no change │
│ QQuery 10 │ 41.90 / 43.06 ±1.08 / 44.50 ms │ 41.73 / 42.53 ±1.07 / 44.62 ms │     no change │
│ QQuery 11 │ 13.51 / 13.88 ±0.64 / 15.16 ms │ 13.33 / 13.63 ±0.22 / 13.98 ms │     no change │
│ QQuery 12 │ 23.79 / 24.22 ±0.66 / 25.53 ms │ 23.83 / 24.14 ±0.29 / 24.54 ms │     no change │
│ QQuery 13 │ 39.15 / 40.62 ±2.25 / 45.09 ms │ 39.26 / 40.53 ±1.20 / 42.03 ms │     no change │
│ QQuery 14 │ 24.34 / 24.97 ±0.69 / 26.07 ms │ 24.09 / 24.37 ±0.19 / 24.64 ms │     no change │
│ QQuery 15 │ 32.19 / 32.48 ±0.24 / 32.91 ms │ 30.31 / 30.88 ±0.97 / 32.81 ms │     no change │
│ QQuery 16 │ 14.60 / 14.78 ±0.19 / 15.13 ms │ 13.71 / 13.93 ±0.12 / 14.03 ms │ +1.06x faster │
│ QQuery 17 │ 77.14 / 77.97 ±0.50 / 78.67 ms │ 69.04 / 70.38 ±1.55 / 73.40 ms │ +1.11x faster │
│ QQuery 18 │ 62.56 / 64.61 ±2.32 / 68.97 ms │ 59.65 / 60.62 ±0.72 / 61.72 ms │ +1.07x faster │
│ QQuery 19 │ 33.43 / 33.67 ±0.25 / 34.04 ms │ 32.26 / 33.21 ±1.23 / 35.62 ms │     no change │
│ QQuery 20 │ 31.99 / 32.12 ±0.07 / 32.21 ms │ 30.79 / 31.16 ±0.27 / 31.54 ms │     no change │
│ QQuery 21 │ 55.91 / 56.49 ±0.62 / 57.69 ms │ 54.34 / 55.17 ±0.73 / 56.14 ms │     no change │
│ QQuery 22 │ 13.69 / 13.93 ±0.13 / 14.04 ms │ 13.92 / 14.11 ±0.19 / 14.42 ms │     no change │
└───────────┴────────────────────────────────┴────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                             ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                             │ 786.66ms │
│ Total Time (first-last-preordered-fastpath)   │ 744.66ms │
│ Average Time (HEAD)                           │  35.76ms │
│ Average Time (first-last-preordered-fastpath) │  33.85ms │
│ Queries Faster                                │        9 │
│ Queries Slower                                │        0 │
│ Queries with No Change                        │       13 │
│ Queries with Failure                          │        0 │
└───────────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.1 GiB
Avg memory 488.7 MiB
CPU user 22.4s
CPU sys 1.7s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 499.0 MiB
CPU user 20.7s
CPU sys 1.6s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing first-last-preordered-fastpath (184bb56) to a5c809f (merge-base) diff

Run configuration
run benchmark tpcds
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and first-last-preordered-fastpath
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃       HEAD ┃ first-last-preordered-fastpath ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │    6.40 ms │                        6.30 ms │     no change │
│ QQuery 2  │   79.96 ms │                       82.37 ms │     no change │
│ QQuery 3  │   29.11 ms │                       30.04 ms │     no change │
│ QQuery 4  │  481.29 ms │                      485.67 ms │     no change │
│ QQuery 5  │   56.41 ms │                       51.71 ms │ +1.09x faster │
│ QQuery 6  │   36.39 ms │                       36.33 ms │     no change │
│ QQuery 7  │   75.41 ms │                       75.60 ms │     no change │
│ QQuery 8  │   36.98 ms │                       36.83 ms │     no change │
│ QQuery 9  │   52.15 ms │                       51.27 ms │     no change │
│ QQuery 10 │   63.39 ms │                       63.32 ms │     no change │
│ QQuery 11 │  343.91 ms │                      300.70 ms │ +1.14x faster │
│ QQuery 12 │   29.93 ms │                       28.77 ms │     no change │
│ QQuery 13 │  121.46 ms │                      119.03 ms │     no change │
│ QQuery 14 │  430.01 ms │                      419.54 ms │     no change │
│ QQuery 15 │   57.33 ms │                       57.30 ms │     no change │
│ QQuery 16 │    6.86 ms │                        6.97 ms │     no change │
│ QQuery 17 │   79.53 ms │                       79.00 ms │     no change │
│ QQuery 18 │  103.80 ms │                      104.49 ms │     no change │
│ QQuery 19 │   41.07 ms │                       41.55 ms │     no change │
│ QQuery 20 │   35.28 ms │                       35.95 ms │     no change │
│ QQuery 21 │   17.78 ms │                       17.37 ms │     no change │
│ QQuery 22 │   63.69 ms │                       62.63 ms │     no change │
│ QQuery 23 │  312.76 ms │                      308.41 ms │     no change │
│ QQuery 24 │  193.93 ms │                      194.63 ms │     no change │
│ QQuery 25 │  109.45 ms │                      114.07 ms │     no change │
│ QQuery 26 │   49.10 ms │                       50.72 ms │     no change │
│ QQuery 27 │    6.13 ms │                        6.60 ms │  1.08x slower │
│ QQuery 28 │   61.61 ms │                       58.71 ms │     no change │
│ QQuery 29 │   96.32 ms │                       99.06 ms │     no change │
│ QQuery 30 │   32.67 ms │                       34.32 ms │  1.05x slower │
│ QQuery 31 │  111.47 ms │                      117.47 ms │  1.05x slower │
│ QQuery 32 │   20.14 ms │                       22.53 ms │  1.12x slower │
│ QQuery 33 │   38.11 ms │                       40.66 ms │  1.07x slower │
│ QQuery 34 │   10.22 ms │                       10.82 ms │  1.06x slower │
│ QQuery 35 │   73.46 ms │                       76.52 ms │     no change │
│ QQuery 36 │    6.06 ms │                        6.22 ms │     no change │
│ QQuery 37 │    6.88 ms │                        7.47 ms │  1.09x slower │
│ QQuery 38 │   61.59 ms │                       64.47 ms │     no change │
│ QQuery 39 │   90.40 ms │                       89.84 ms │     no change │
│ QQuery 40 │   26.98 ms │                       24.14 ms │ +1.12x faster │
│ QQuery 41 │   12.55 ms │                       11.36 ms │ +1.10x faster │
│ QQuery 42 │   23.97 ms │                       24.43 ms │     no change │
│ QQuery 43 │    5.37 ms │                        5.36 ms │     no change │
│ QQuery 44 │    9.58 ms │                        9.57 ms │     no change │
│ QQuery 45 │   38.43 ms │                       38.81 ms │     no change │
│ QQuery 46 │   11.87 ms │                       12.06 ms │     no change │
│ QQuery 47 │  234.50 ms │                      226.71 ms │     no change │
│ QQuery 48 │   98.30 ms │                       96.55 ms │     no change │
│ QQuery 49 │   73.88 ms │                       71.79 ms │     no change │
│ QQuery 50 │   61.57 ms │                       58.85 ms │     no change │
│ QQuery 51 │   92.08 ms │                       92.31 ms │     no change │
│ QQuery 52 │   24.81 ms │                       23.99 ms │     no change │
│ QQuery 53 │   29.57 ms │                       29.31 ms │     no change │
│ QQuery 54 │   55.91 ms │                       55.30 ms │     no change │
│ QQuery 55 │   23.35 ms │                       23.60 ms │     no change │
│ QQuery 56 │   39.25 ms │                       38.94 ms │     no change │
│ QQuery 57 │  176.39 ms │                      173.94 ms │     no change │
│ QQuery 58 │  112.57 ms │                      111.07 ms │     no change │
│ QQuery 59 │  117.19 ms │                      118.16 ms │     no change │
│ QQuery 60 │   40.62 ms │                       39.47 ms │     no change │
│ QQuery 61 │   13.21 ms │                       12.55 ms │     no change │
│ QQuery 62 │   46.79 ms │                       46.01 ms │     no change │
│ QQuery 63 │   30.01 ms │                       29.29 ms │     no change │
│ QQuery 64 │  373.80 ms │                      369.32 ms │     no change │
│ QQuery 65 │  122.91 ms │                      119.50 ms │     no change │
│ QQuery 66 │   82.18 ms │                       81.30 ms │     no change │
│ QQuery 67 │  242.52 ms │                      240.66 ms │     no change │
│ QQuery 68 │   12.14 ms │                       12.61 ms │     no change │
│ QQuery 69 │   57.73 ms │                       58.11 ms │     no change │
│ QQuery 70 │  105.74 ms │                      110.07 ms │     no change │
│ QQuery 71 │   35.67 ms │                       36.46 ms │     no change │
│ QQuery 72 │ 1756.22 ms │                     1792.71 ms │     no change │
│ QQuery 73 │    9.88 ms │                        9.82 ms │     no change │
│ QQuery 74 │  170.09 ms │                      171.85 ms │     no change │
│ QQuery 75 │  146.10 ms │                      146.37 ms │     no change │
│ QQuery 76 │   37.27 ms │                       35.50 ms │     no change │
│ QQuery 77 │   63.91 ms │                       61.28 ms │     no change │
│ QQuery 78 │  235.21 ms │                      221.83 ms │ +1.06x faster │
│ QQuery 79 │   66.18 ms │                       68.22 ms │     no change │
│ QQuery 80 │  100.29 ms │                       98.51 ms │     no change │
│ QQuery 81 │   26.00 ms │                       25.75 ms │     no change │
│ QQuery 82 │   16.27 ms │                       16.62 ms │     no change │
│ QQuery 83 │   34.38 ms │                       34.89 ms │     no change │
│ QQuery 84 │   30.67 ms │                       30.40 ms │     no change │
│ QQuery 85 │  103.29 ms │                      107.00 ms │     no change │
│ QQuery 86 │   25.35 ms │                       26.45 ms │     no change │
│ QQuery 87 │   62.87 ms │                       66.57 ms │  1.06x slower │
│ QQuery 88 │   63.58 ms │                       66.10 ms │     no change │
│ QQuery 89 │   35.41 ms │                       36.17 ms │     no change │
│ QQuery 90 │   17.30 ms │                       18.11 ms │     no change │
│ QQuery 91 │   45.33 ms │                       46.66 ms │     no change │
│ QQuery 92 │   29.65 ms │                       31.23 ms │  1.05x slower │
│ QQuery 93 │   49.12 ms │                       51.98 ms │  1.06x slower │
│ QQuery 94 │   38.57 ms │                       39.56 ms │     no change │
│ QQuery 95 │   80.72 ms │                       83.58 ms │     no change │
│ QQuery 96 │   24.95 ms │                       25.16 ms │     no change │
│ QQuery 97 │   51.68 ms │                       53.66 ms │     no change │
│ QQuery 98 │   42.84 ms │                       43.05 ms │     no change │
│ QQuery 99 │   69.80 ms │                       71.19 ms │     no change │
└───────────┴────────────┴────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Benchmark Summary                             ┃           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ Total Time (HEAD)                             │ 9392.77ms │
│ Total Time (first-last-preordered-fastpath)   │ 9377.07ms │
│ Average Time (HEAD)                           │   94.88ms │
│ Average Time (first-last-preordered-fastpath) │   94.72ms │
│ Queries Faster                                │         5 │
│ Queries Slower                                │        10 │
│ Queries with No Change                        │        84 │
│ Queries with Failure                          │         0 │
└───────────────────────────────────────────────┴───────────┘

Distribution per query (min / mean ±stddev / max):

Comparing HEAD and first-last-preordered-fastpath
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                  HEAD ┃        first-last-preordered-fastpath ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │           6.40 / 6.95 ±0.91 / 8.76 ms │           6.30 / 6.81 ±0.83 / 8.47 ms │     no change │
│ QQuery 2  │        79.96 / 81.38 ±1.01 / 83.02 ms │        82.37 / 83.16 ±0.50 / 83.81 ms │     no change │
│ QQuery 3  │        29.11 / 29.25 ±0.09 / 29.36 ms │        30.04 / 30.38 ±0.22 / 30.65 ms │     no change │
│ QQuery 4  │     481.29 / 495.55 ±9.47 / 503.97 ms │    485.67 / 516.24 ±24.06 / 557.23 ms │     no change │
│ QQuery 5  │        56.41 / 57.06 ±0.74 / 58.49 ms │        51.71 / 52.47 ±0.56 / 52.99 ms │ +1.09x faster │
│ QQuery 6  │        36.39 / 37.42 ±1.18 / 39.69 ms │        36.33 / 36.64 ±0.33 / 37.28 ms │     no change │
│ QQuery 7  │        75.41 / 75.64 ±0.17 / 75.80 ms │        75.60 / 77.33 ±1.82 / 80.44 ms │     no change │
│ QQuery 8  │        36.98 / 39.25 ±2.63 / 44.06 ms │        36.83 / 38.57 ±2.56 / 43.66 ms │     no change │
│ QQuery 9  │        52.15 / 54.25 ±1.96 / 57.64 ms │        51.27 / 53.15 ±1.83 / 56.28 ms │     no change │
│ QQuery 10 │        63.39 / 64.80 ±0.81 / 65.52 ms │        63.32 / 63.66 ±0.39 / 64.39 ms │     no change │
│ QQuery 11 │     343.91 / 347.70 ±4.06 / 355.52 ms │    300.70 / 317.34 ±18.32 / 347.82 ms │ +1.10x faster │
│ QQuery 12 │        29.93 / 30.49 ±0.45 / 31.30 ms │        28.77 / 29.23 ±0.37 / 29.86 ms │     no change │
│ QQuery 13 │     121.46 / 124.35 ±2.48 / 127.91 ms │     119.03 / 122.15 ±3.16 / 128.05 ms │     no change │
│ QQuery 14 │     430.01 / 436.58 ±4.14 / 442.31 ms │     419.54 / 426.94 ±7.72 / 441.90 ms │     no change │
│ QQuery 15 │        57.33 / 58.06 ±0.70 / 59.33 ms │        57.30 / 57.76 ±0.29 / 58.22 ms │     no change │
│ QQuery 16 │           6.86 / 7.04 ±0.25 / 7.54 ms │           6.97 / 7.14 ±0.22 / 7.57 ms │     no change │
│ QQuery 17 │        79.53 / 82.88 ±2.24 / 85.67 ms │        79.00 / 82.21 ±2.63 / 86.45 ms │     no change │
│ QQuery 18 │     103.80 / 107.21 ±4.08 / 115.20 ms │     104.49 / 106.37 ±2.02 / 110.13 ms │     no change │
│ QQuery 19 │        41.07 / 42.04 ±0.70 / 42.92 ms │        41.55 / 42.06 ±0.36 / 42.52 ms │     no change │
│ QQuery 20 │        35.28 / 36.43 ±0.63 / 37.07 ms │        35.95 / 37.09 ±1.10 / 39.01 ms │     no change │
│ QQuery 21 │        17.78 / 18.42 ±0.43 / 18.87 ms │        17.37 / 17.73 ±0.25 / 18.12 ms │     no change │
│ QQuery 22 │        63.69 / 69.15 ±4.54 / 74.78 ms │        62.63 / 63.54 ±0.72 / 64.63 ms │ +1.09x faster │
│ QQuery 23 │     312.76 / 320.35 ±8.11 / 333.60 ms │     308.41 / 319.35 ±9.35 / 331.75 ms │     no change │
│ QQuery 24 │     193.93 / 202.25 ±8.53 / 217.48 ms │    194.63 / 207.06 ±14.20 / 230.58 ms │     no change │
│ QQuery 25 │     109.45 / 114.87 ±4.59 / 120.58 ms │     114.07 / 115.05 ±0.84 / 116.56 ms │     no change │
│ QQuery 26 │        49.10 / 51.61 ±3.77 / 59.08 ms │        50.72 / 51.04 ±0.28 / 51.41 ms │     no change │
│ QQuery 27 │           6.13 / 6.33 ±0.18 / 6.66 ms │           6.60 / 6.74 ±0.15 / 7.01 ms │  1.07x slower │
│ QQuery 28 │        61.61 / 62.53 ±0.73 / 63.25 ms │        58.71 / 62.17 ±2.01 / 64.88 ms │     no change │
│ QQuery 29 │       96.32 / 97.87 ±1.63 / 100.74 ms │      99.06 / 100.56 ±1.83 / 103.94 ms │     no change │
│ QQuery 30 │        32.67 / 34.94 ±3.63 / 42.19 ms │        34.32 / 34.57 ±0.37 / 35.29 ms │     no change │
│ QQuery 31 │     111.47 / 113.48 ±1.73 / 116.50 ms │     117.47 / 119.31 ±1.20 / 121.02 ms │  1.05x slower │
│ QQuery 32 │        20.14 / 20.60 ±0.44 / 21.38 ms │        22.53 / 22.75 ±0.23 / 23.17 ms │  1.10x slower │
│ QQuery 33 │        38.11 / 38.61 ±0.29 / 38.98 ms │        40.66 / 41.24 ±0.38 / 41.83 ms │  1.07x slower │
│ QQuery 34 │        10.22 / 12.10 ±3.14 / 18.35 ms │        10.82 / 11.23 ±0.36 / 11.78 ms │ +1.08x faster │
│ QQuery 35 │        73.46 / 76.85 ±2.69 / 81.60 ms │        76.52 / 79.04 ±1.59 / 80.61 ms │     no change │
│ QQuery 36 │           6.06 / 6.23 ±0.17 / 6.54 ms │           6.22 / 6.31 ±0.11 / 6.51 ms │     no change │
│ QQuery 37 │           6.88 / 6.96 ±0.08 / 7.11 ms │           7.47 / 7.62 ±0.14 / 7.88 ms │  1.10x slower │
│ QQuery 38 │        61.59 / 62.25 ±0.35 / 62.61 ms │        64.47 / 68.27 ±2.16 / 70.30 ms │  1.10x slower │
│ QQuery 39 │        90.40 / 91.50 ±1.21 / 93.79 ms │        89.84 / 92.09 ±1.38 / 94.12 ms │     no change │
│ QQuery 40 │        26.98 / 27.18 ±0.19 / 27.51 ms │        24.14 / 25.60 ±1.54 / 28.58 ms │ +1.06x faster │
│ QQuery 41 │        12.55 / 12.60 ±0.03 / 12.64 ms │        11.36 / 11.65 ±0.21 / 11.94 ms │ +1.08x faster │
│ QQuery 42 │        23.97 / 25.80 ±1.11 / 27.31 ms │        24.43 / 25.50 ±0.97 / 26.94 ms │     no change │
│ QQuery 43 │           5.37 / 5.51 ±0.16 / 5.82 ms │           5.36 / 5.49 ±0.17 / 5.81 ms │     no change │
│ QQuery 44 │           9.58 / 9.73 ±0.13 / 9.88 ms │           9.57 / 9.65 ±0.09 / 9.82 ms │     no change │
│ QQuery 45 │        38.43 / 39.06 ±0.45 / 39.61 ms │        38.81 / 39.60 ±0.60 / 40.45 ms │     no change │
│ QQuery 46 │        11.87 / 12.32 ±0.38 / 12.78 ms │        12.06 / 12.31 ±0.29 / 12.87 ms │     no change │
│ QQuery 47 │    234.50 / 250.31 ±13.83 / 270.40 ms │    226.71 / 232.89 ±10.37 / 253.54 ms │ +1.07x faster │
│ QQuery 48 │        98.30 / 98.93 ±0.41 / 99.44 ms │       96.55 / 99.40 ±2.23 / 102.60 ms │     no change │
│ QQuery 49 │        73.88 / 75.72 ±1.63 / 78.36 ms │        71.79 / 72.26 ±0.74 / 73.73 ms │     no change │
│ QQuery 50 │        61.57 / 64.10 ±2.62 / 69.18 ms │        58.85 / 60.23 ±2.22 / 64.66 ms │ +1.06x faster │
│ QQuery 51 │        92.08 / 93.59 ±1.30 / 96.02 ms │        92.31 / 94.55 ±2.07 / 98.38 ms │     no change │
│ QQuery 52 │        24.81 / 25.46 ±0.54 / 26.30 ms │        23.99 / 24.36 ±0.51 / 25.34 ms │     no change │
│ QQuery 53 │        29.57 / 32.00 ±4.05 / 40.07 ms │        29.31 / 29.49 ±0.16 / 29.79 ms │ +1.09x faster │
│ QQuery 54 │        55.91 / 57.03 ±1.48 / 59.94 ms │        55.30 / 55.83 ±0.43 / 56.40 ms │     no change │
│ QQuery 55 │        23.35 / 23.95 ±0.36 / 24.32 ms │        23.60 / 23.91 ±0.49 / 24.86 ms │     no change │
│ QQuery 56 │        39.25 / 39.47 ±0.18 / 39.75 ms │        38.94 / 40.78 ±1.19 / 42.24 ms │     no change │
│ QQuery 57 │     176.39 / 181.45 ±7.78 / 196.92 ms │     173.94 / 177.17 ±1.86 / 179.74 ms │     no change │
│ QQuery 58 │     112.57 / 115.93 ±3.14 / 120.90 ms │     111.07 / 112.83 ±1.72 / 115.34 ms │     no change │
│ QQuery 59 │     117.19 / 119.57 ±1.60 / 120.98 ms │     118.16 / 119.72 ±0.98 / 120.72 ms │     no change │
│ QQuery 60 │        40.62 / 42.45 ±1.51 / 44.32 ms │        39.47 / 40.13 ±0.56 / 40.71 ms │ +1.06x faster │
│ QQuery 61 │        13.21 / 14.52 ±1.86 / 18.20 ms │        12.55 / 12.67 ±0.13 / 12.92 ms │ +1.15x faster │
│ QQuery 62 │        46.79 / 47.63 ±1.21 / 50.04 ms │        46.01 / 46.48 ±0.44 / 47.25 ms │     no change │
│ QQuery 63 │        30.01 / 30.48 ±0.42 / 31.12 ms │        29.29 / 30.71 ±2.04 / 34.77 ms │     no change │
│ QQuery 64 │     373.80 / 378.81 ±5.51 / 389.41 ms │     369.32 / 372.69 ±5.70 / 384.04 ms │     no change │
│ QQuery 65 │     122.91 / 125.58 ±3.02 / 131.37 ms │     119.50 / 124.85 ±4.32 / 132.68 ms │     no change │
│ QQuery 66 │        82.18 / 85.19 ±2.96 / 89.12 ms │        81.30 / 83.06 ±2.11 / 87.13 ms │     no change │
│ QQuery 67 │     242.52 / 250.62 ±7.27 / 264.20 ms │     240.66 / 251.05 ±8.31 / 264.64 ms │     no change │
│ QQuery 68 │        12.14 / 12.34 ±0.21 / 12.72 ms │        12.61 / 13.02 ±0.21 / 13.19 ms │  1.05x slower │
│ QQuery 69 │        57.73 / 59.32 ±1.29 / 61.20 ms │        58.11 / 59.03 ±0.93 / 60.24 ms │     no change │
│ QQuery 70 │     105.74 / 110.03 ±4.50 / 118.59 ms │     110.07 / 114.81 ±4.56 / 122.04 ms │     no change │
│ QQuery 71 │        35.67 / 36.26 ±0.58 / 37.23 ms │        36.46 / 37.34 ±0.61 / 38.30 ms │     no change │
│ QQuery 72 │ 1756.22 / 1903.28 ±94.25 / 2052.26 ms │ 1792.71 / 1844.05 ±26.74 / 1871.36 ms │     no change │
│ QQuery 73 │         9.88 / 10.24 ±0.33 / 10.79 ms │         9.82 / 10.44 ±0.32 / 10.71 ms │     no change │
│ QQuery 74 │    170.09 / 179.51 ±12.73 / 204.29 ms │     171.85 / 177.53 ±5.42 / 184.73 ms │     no change │
│ QQuery 75 │     146.10 / 149.14 ±2.64 / 152.88 ms │     146.37 / 148.56 ±1.14 / 149.35 ms │     no change │
│ QQuery 76 │        37.27 / 39.94 ±4.55 / 48.99 ms │        35.50 / 35.65 ±0.11 / 35.82 ms │ +1.12x faster │
│ QQuery 77 │        63.91 / 65.68 ±3.00 / 71.67 ms │        61.28 / 61.83 ±0.45 / 62.51 ms │ +1.06x faster │
│ QQuery 78 │     235.21 / 246.08 ±9.49 / 263.32 ms │     221.83 / 228.03 ±6.52 / 237.69 ms │ +1.08x faster │
│ QQuery 79 │        66.18 / 69.09 ±2.62 / 72.61 ms │        68.22 / 70.86 ±3.75 / 78.24 ms │     no change │
│ QQuery 80 │     100.29 / 103.30 ±4.62 / 112.35 ms │      98.51 / 100.43 ±1.93 / 104.02 ms │     no change │
│ QQuery 81 │        26.00 / 26.19 ±0.12 / 26.32 ms │        25.75 / 26.14 ±0.21 / 26.31 ms │     no change │
│ QQuery 82 │        16.27 / 16.47 ±0.17 / 16.68 ms │        16.62 / 17.41 ±0.50 / 18.06 ms │  1.06x slower │
│ QQuery 83 │        34.38 / 36.40 ±2.16 / 40.39 ms │        34.89 / 37.45 ±3.31 / 43.95 ms │     no change │
│ QQuery 84 │        30.67 / 32.65 ±3.43 / 39.49 ms │        30.40 / 31.60 ±1.09 / 33.59 ms │     no change │
│ QQuery 85 │     103.29 / 104.47 ±1.12 / 106.49 ms │     107.00 / 107.58 ±0.57 / 108.40 ms │     no change │
│ QQuery 86 │        25.35 / 25.57 ±0.12 / 25.69 ms │        26.45 / 27.12 ±0.34 / 27.37 ms │  1.06x slower │
│ QQuery 87 │        62.87 / 65.01 ±2.32 / 68.77 ms │        66.57 / 67.87 ±0.70 / 68.46 ms │     no change │
│ QQuery 88 │        63.58 / 65.15 ±1.54 / 68.06 ms │        66.10 / 66.31 ±0.28 / 66.86 ms │     no change │
│ QQuery 89 │        35.41 / 36.47 ±0.65 / 37.11 ms │        36.17 / 36.81 ±0.41 / 37.40 ms │     no change │
│ QQuery 90 │        17.30 / 17.46 ±0.21 / 17.87 ms │        18.11 / 18.24 ±0.11 / 18.43 ms │     no change │
│ QQuery 91 │        45.33 / 46.02 ±0.66 / 47.28 ms │        46.66 / 47.52 ±1.21 / 49.92 ms │     no change │
│ QQuery 92 │        29.65 / 29.81 ±0.21 / 30.21 ms │        31.23 / 32.39 ±1.06 / 34.30 ms │  1.09x slower │
│ QQuery 93 │        49.12 / 50.87 ±1.31 / 52.92 ms │        51.98 / 53.10 ±0.91 / 54.37 ms │     no change │
│ QQuery 94 │        38.57 / 39.80 ±1.38 / 42.46 ms │        39.56 / 40.38 ±0.54 / 41.02 ms │     no change │
│ QQuery 95 │        80.72 / 82.16 ±1.29 / 84.48 ms │        83.58 / 88.09 ±4.21 / 94.20 ms │  1.07x slower │
│ QQuery 96 │        24.95 / 25.07 ±0.20 / 25.47 ms │        25.16 / 25.37 ±0.14 / 25.51 ms │     no change │
│ QQuery 97 │        51.68 / 54.69 ±3.36 / 60.86 ms │        53.66 / 55.13 ±1.66 / 58.16 ms │     no change │
│ QQuery 98 │        42.84 / 43.65 ±1.18 / 46.00 ms │        43.05 / 44.64 ±1.17 / 46.57 ms │     no change │
│ QQuery 99 │        69.80 / 70.56 ±0.83 / 72.16 ms │        71.19 / 73.77 ±3.46 / 80.51 ms │     no change │
└───────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Benchmark Summary                             ┃           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ Total Time (HEAD)                             │ 9758.91ms │
│ Total Time (first-last-preordered-fastpath)   │ 9645.69ms │
│ Average Time (HEAD)                           │   98.57ms │
│ Average Time (first-last-preordered-fastpath) │   97.43ms │
│ Queries Faster                                │        14 │
│ Queries Slower                                │        11 │
│ Queries with No Change                        │        74 │
│ Queries with Failure                          │         0 │
└───────────────────────────────────────────────┴───────────┘

Resource Usage

tpcds — base (merge-base)

Metric Value
Wall time 50.0s
Peak memory 2.2 GiB
Avg memory 1.6 GiB
CPU user 210.8s
CPU sys 6.0s
Peak spill 0 B

tpcds — branch

Metric Value
Wall time 50.0s
Peak memory 2.1 GiB
Avg memory 1.4 GiB
CPU user 207.2s
CPU sys 5.7s
Peak spill 0 B

File an issue against this benchmark runner

@comphead

comphead commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

For TPCH it is consistently faster, mixed results for TPCDS which might indicate just noise.

@comphead

comphead commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

run benchmark tpcds

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5604402031-2270-fttrv 6.12.94+ #1 SMP Fri Jul 17 09:42:57 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing first-last-preordered-fastpath (184bb56) to a5c809f (merge-base) diff

Run configuration
run benchmark tpcds

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing first-last-preordered-fastpath (184bb56) to a5c809f (merge-base) diff

Run configuration
run benchmark tpcds
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and first-last-preordered-fastpath
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃       HEAD ┃ first-last-preordered-fastpath ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │    5.82 ms │                        5.78 ms │     no change │
│ QQuery 2  │   80.03 ms │                       80.22 ms │     no change │
│ QQuery 3  │   28.59 ms │                       28.59 ms │     no change │
│ QQuery 4  │  475.69 ms │                      473.02 ms │     no change │
│ QQuery 5  │   51.89 ms │                       51.72 ms │     no change │
│ QQuery 6  │   35.57 ms │                       35.95 ms │     no change │
│ QQuery 7  │   74.84 ms │                       74.47 ms │     no change │
│ QQuery 8  │   36.56 ms │                       36.22 ms │     no change │
│ QQuery 9  │   53.82 ms │                       52.98 ms │     no change │
│ QQuery 10 │   63.22 ms │                       62.80 ms │     no change │
│ QQuery 11 │  290.79 ms │                      289.26 ms │     no change │
│ QQuery 12 │   28.39 ms │                       28.58 ms │     no change │
│ QQuery 13 │  116.87 ms │                      117.38 ms │     no change │
│ QQuery 14 │  415.30 ms │                      415.04 ms │     no change │
│ QQuery 15 │   56.04 ms │                       56.55 ms │     no change │
│ QQuery 16 │    6.88 ms │                        6.91 ms │     no change │
│ QQuery 17 │   78.63 ms │                       79.08 ms │     no change │
│ QQuery 18 │  103.23 ms │                      103.42 ms │     no change │
│ QQuery 19 │   40.66 ms │                       41.15 ms │     no change │
│ QQuery 20 │   34.70 ms │                       35.26 ms │     no change │
│ QQuery 21 │   17.15 ms │                       17.28 ms │     no change │
│ QQuery 22 │   62.96 ms │                       68.40 ms │  1.09x slower │
│ QQuery 23 │  305.67 ms │                      306.96 ms │     no change │
│ QQuery 24 │  190.20 ms │                      200.21 ms │  1.05x slower │
│ QQuery 25 │  108.90 ms │                      109.54 ms │     no change │
│ QQuery 26 │   48.82 ms │                       48.67 ms │     no change │
│ QQuery 27 │    6.17 ms │                        6.02 ms │     no change │
│ QQuery 28 │   60.12 ms │                       56.75 ms │ +1.06x faster │
│ QQuery 29 │   96.59 ms │                       95.60 ms │     no change │
│ QQuery 30 │   32.02 ms │                       32.12 ms │     no change │
│ QQuery 31 │  109.81 ms │                      110.28 ms │     no change │
│ QQuery 32 │   20.61 ms │                       20.23 ms │     no change │
│ QQuery 33 │   37.65 ms │                       37.47 ms │     no change │
│ QQuery 34 │   10.07 ms │                        9.99 ms │     no change │
│ QQuery 35 │   72.64 ms │                       72.09 ms │     no change │
│ QQuery 36 │    6.05 ms │                        5.76 ms │     no change │
│ QQuery 37 │    7.30 ms │                        6.77 ms │ +1.08x faster │
│ QQuery 38 │   68.03 ms │                       61.07 ms │ +1.11x faster │
│ QQuery 39 │  101.75 ms │                       89.04 ms │ +1.14x faster │
│ QQuery 40 │   26.54 ms │                       23.63 ms │ +1.12x faster │
│ QQuery 41 │   12.40 ms │                       11.22 ms │ +1.11x faster │
│ QQuery 42 │   24.89 ms │                       23.32 ms │ +1.07x faster │
│ QQuery 43 │    6.20 ms │                        5.36 ms │ +1.16x faster │
│ QQuery 44 │   10.59 ms │                        9.49 ms │ +1.12x faster │
│ QQuery 45 │   48.80 ms │                       37.88 ms │ +1.29x faster │
│ QQuery 46 │   13.11 ms │                       11.69 ms │ +1.12x faster │
│ QQuery 47 │  277.73 ms │                      221.33 ms │ +1.25x faster │
│ QQuery 48 │  100.28 ms │                       94.94 ms │ +1.06x faster │
│ QQuery 49 │   75.23 ms │                       70.46 ms │ +1.07x faster │
│ QQuery 50 │   61.49 ms │                       58.38 ms │ +1.05x faster │
│ QQuery 51 │   98.09 ms │                       92.46 ms │ +1.06x faster │
│ QQuery 52 │   25.39 ms │                       23.55 ms │ +1.08x faster │
│ QQuery 53 │   30.37 ms │                       28.56 ms │ +1.06x faster │
│ QQuery 54 │   57.90 ms │                       53.89 ms │ +1.07x faster │
│ QQuery 55 │   24.74 ms │                       23.04 ms │ +1.07x faster │
│ QQuery 56 │   42.45 ms │                       38.01 ms │ +1.12x faster │
│ QQuery 57 │  189.62 ms │                      173.20 ms │ +1.09x faster │
│ QQuery 58 │  116.65 ms │                      110.26 ms │ +1.06x faster │
│ QQuery 59 │  117.74 ms │                      117.22 ms │     no change │
│ QQuery 60 │   39.36 ms │                       39.19 ms │     no change │
│ QQuery 61 │   12.53 ms │                       12.30 ms │     no change │
│ QQuery 62 │   45.88 ms │                       45.64 ms │     no change │
│ QQuery 63 │   28.95 ms │                       28.79 ms │     no change │
│ QQuery 64 │  359.19 ms │                      364.03 ms │     no change │
│ QQuery 65 │  121.80 ms │                      127.64 ms │     no change │
│ QQuery 66 │   81.75 ms │                       87.25 ms │  1.07x slower │
│ QQuery 67 │  252.75 ms │                      279.48 ms │  1.11x slower │
│ QQuery 68 │   12.07 ms │                       13.16 ms │  1.09x slower │
│ QQuery 69 │   57.39 ms │                       60.13 ms │     no change │
│ QQuery 70 │  104.58 ms │                      110.90 ms │  1.06x slower │
│ QQuery 71 │   35.16 ms │                       37.57 ms │  1.07x slower │
│ QQuery 72 │ 1866.54 ms │                     1847.78 ms │     no change │
│ QQuery 73 │    9.75 ms │                       10.80 ms │  1.11x slower │
│ QQuery 74 │  165.79 ms │                      168.48 ms │     no change │
│ QQuery 75 │  144.78 ms │                      146.32 ms │     no change │
│ QQuery 76 │   34.85 ms │                       34.72 ms │     no change │
│ QQuery 77 │   61.17 ms │                       60.94 ms │     no change │
│ QQuery 78 │  216.87 ms │                      219.11 ms │     no change │
│ QQuery 79 │   65.68 ms │                       70.92 ms │  1.08x slower │
│ QQuery 80 │   98.95 ms │                      105.15 ms │  1.06x slower │
│ QQuery 81 │   25.59 ms │                       28.40 ms │  1.11x slower │
│ QQuery 82 │   16.14 ms │                       17.49 ms │  1.08x slower │
│ QQuery 83 │   33.67 ms │                       36.43 ms │  1.08x slower │
│ QQuery 84 │   29.75 ms │                       30.68 ms │     no change │
│ QQuery 85 │  107.76 ms │                      108.05 ms │     no change │
│ QQuery 86 │   27.47 ms │                       27.68 ms │     no change │
│ QQuery 87 │   69.21 ms │                       69.30 ms │     no change │
│ QQuery 88 │   67.45 ms │                       67.00 ms │     no change │
│ QQuery 89 │   36.91 ms │                       37.33 ms │     no change │
│ QQuery 90 │   17.32 ms │                       18.52 ms │  1.07x slower │
│ QQuery 91 │   44.56 ms │                       48.00 ms │  1.08x slower │
│ QQuery 92 │   30.99 ms │                       32.23 ms │     no change │
│ QQuery 93 │   49.40 ms │                       53.66 ms │  1.09x slower │
│ QQuery 94 │   37.40 ms │                       41.23 ms │  1.10x slower │
│ QQuery 95 │   79.57 ms │                       86.57 ms │  1.09x slower │
│ QQuery 96 │   23.60 ms │                       25.21 ms │  1.07x slower │
│ QQuery 97 │   51.89 ms │                       55.08 ms │  1.06x slower │
│ QQuery 98 │   41.79 ms │                       46.75 ms │  1.12x slower │
│ QQuery 99 │   69.60 ms │                       70.52 ms │     no change │
└───────────┴────────────┴────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Benchmark Summary                             ┃           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ Total Time (HEAD)                             │ 9476.10ms │
│ Total Time (first-last-preordered-fastpath)   │ 9426.96ms │
│ Average Time (HEAD)                           │   95.72ms │
│ Average Time (first-last-preordered-fastpath) │   95.22ms │
│ Queries Faster                                │        23 │
│ Queries Slower                                │        21 │
│ Queries with No Change                        │        55 │
│ Queries with Failure                          │         0 │
└───────────────────────────────────────────────┴───────────┘

Distribution per query (min / mean ±stddev / max):

Comparing HEAD and first-last-preordered-fastpath
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                  HEAD ┃        first-last-preordered-fastpath ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │           5.82 / 6.34 ±0.94 / 8.23 ms │           5.78 / 6.30 ±0.92 / 8.14 ms │     no change │
│ QQuery 2  │        80.03 / 81.09 ±1.21 / 83.34 ms │        80.22 / 80.91 ±0.49 / 81.74 ms │     no change │
│ QQuery 3  │        28.59 / 28.84 ±0.28 / 29.23 ms │        28.59 / 28.77 ±0.16 / 29.03 ms │     no change │
│ QQuery 4  │    475.69 / 527.90 ±39.90 / 567.36 ms │     473.02 / 477.59 ±3.67 / 482.29 ms │ +1.11x faster │
│ QQuery 5  │        51.89 / 52.27 ±0.29 / 52.76 ms │        51.72 / 53.81 ±2.84 / 59.35 ms │     no change │
│ QQuery 6  │        35.57 / 36.22 ±0.47 / 36.90 ms │        35.95 / 36.39 ±0.32 / 36.94 ms │     no change │
│ QQuery 7  │        74.84 / 75.96 ±1.72 / 79.38 ms │        74.47 / 75.30 ±0.57 / 76.08 ms │     no change │
│ QQuery 8  │        36.56 / 37.23 ±0.59 / 38.24 ms │        36.22 / 36.70 ±0.52 / 37.65 ms │     no change │
│ QQuery 9  │        53.82 / 54.81 ±0.94 / 56.58 ms │        52.98 / 54.26 ±1.22 / 56.21 ms │     no change │
│ QQuery 10 │        63.22 / 64.07 ±0.57 / 64.87 ms │        62.80 / 63.25 ±0.31 / 63.65 ms │     no change │
│ QQuery 11 │     290.79 / 296.09 ±5.53 / 305.44 ms │     289.26 / 293.35 ±2.29 / 296.18 ms │     no change │
│ QQuery 12 │        28.39 / 28.84 ±0.38 / 29.50 ms │        28.58 / 28.98 ±0.24 / 29.32 ms │     no change │
│ QQuery 13 │     116.87 / 117.58 ±0.71 / 118.85 ms │     117.38 / 117.65 ±0.29 / 118.16 ms │     no change │
│ QQuery 14 │     415.30 / 418.93 ±3.51 / 424.36 ms │     415.04 / 421.11 ±4.48 / 426.57 ms │     no change │
│ QQuery 15 │        56.04 / 57.02 ±0.75 / 57.80 ms │        56.55 / 58.33 ±2.49 / 63.24 ms │     no change │
│ QQuery 16 │           6.88 / 7.07 ±0.23 / 7.50 ms │           6.91 / 7.08 ±0.21 / 7.49 ms │     no change │
│ QQuery 17 │        78.63 / 78.88 ±0.25 / 79.31 ms │        79.08 / 80.41 ±1.16 / 82.40 ms │     no change │
│ QQuery 18 │     103.23 / 105.61 ±2.20 / 109.43 ms │     103.42 / 105.14 ±1.97 / 108.93 ms │     no change │
│ QQuery 19 │        40.66 / 40.84 ±0.10 / 40.96 ms │        41.15 / 41.39 ±0.21 / 41.68 ms │     no change │
│ QQuery 20 │        34.70 / 34.98 ±0.42 / 35.81 ms │        35.26 / 35.64 ±0.39 / 36.26 ms │     no change │
│ QQuery 21 │        17.15 / 17.31 ±0.15 / 17.54 ms │        17.28 / 17.54 ±0.27 / 18.04 ms │     no change │
│ QQuery 22 │        62.96 / 63.11 ±0.12 / 63.28 ms │        68.40 / 71.81 ±2.65 / 76.57 ms │  1.14x slower │
│ QQuery 23 │     305.67 / 309.50 ±3.57 / 315.97 ms │    306.96 / 342.08 ±20.44 / 367.41 ms │  1.11x slower │
│ QQuery 24 │     190.20 / 192.67 ±1.65 / 194.47 ms │     200.21 / 208.62 ±6.28 / 215.47 ms │  1.08x slower │
│ QQuery 25 │     108.90 / 110.24 ±1.11 / 112.20 ms │     109.54 / 111.55 ±1.78 / 113.70 ms │     no change │
│ QQuery 26 │        48.82 / 49.02 ±0.18 / 49.30 ms │        48.67 / 49.17 ±0.52 / 50.17 ms │     no change │
│ QQuery 27 │           6.17 / 6.33 ±0.22 / 6.76 ms │           6.02 / 6.25 ±0.21 / 6.63 ms │     no change │
│ QQuery 28 │        60.12 / 60.51 ±0.54 / 61.53 ms │        56.75 / 60.18 ±3.42 / 66.10 ms │     no change │
│ QQuery 29 │       96.59 / 98.64 ±1.79 / 101.56 ms │        95.60 / 96.99 ±1.21 / 98.74 ms │     no change │
│ QQuery 30 │        32.02 / 32.33 ±0.20 / 32.62 ms │        32.12 / 32.22 ±0.10 / 32.36 ms │     no change │
│ QQuery 31 │     109.81 / 111.09 ±1.75 / 114.51 ms │     110.28 / 112.92 ±2.19 / 116.80 ms │     no change │
│ QQuery 32 │        20.61 / 21.57 ±1.16 / 23.81 ms │        20.23 / 20.61 ±0.46 / 21.48 ms │     no change │
│ QQuery 33 │        37.65 / 38.55 ±0.65 / 39.64 ms │        37.47 / 37.88 ±0.33 / 38.38 ms │     no change │
│ QQuery 34 │        10.07 / 10.35 ±0.19 / 10.60 ms │         9.99 / 10.17 ±0.19 / 10.46 ms │     no change │
│ QQuery 35 │        72.64 / 73.09 ±0.38 / 73.73 ms │        72.09 / 72.70 ±0.54 / 73.58 ms │     no change │
│ QQuery 36 │           6.05 / 6.19 ±0.23 / 6.65 ms │           5.76 / 5.89 ±0.18 / 6.24 ms │     no change │
│ QQuery 37 │           7.30 / 7.63 ±0.17 / 7.76 ms │           6.77 / 6.90 ±0.08 / 7.00 ms │ +1.11x faster │
│ QQuery 38 │        68.03 / 70.16 ±1.30 / 72.03 ms │        61.07 / 61.70 ±0.59 / 62.79 ms │ +1.14x faster │
│ QQuery 39 │     101.75 / 103.30 ±1.35 / 105.45 ms │        89.04 / 89.42 ±0.41 / 89.94 ms │ +1.16x faster │
│ QQuery 40 │        26.54 / 27.23 ±0.46 / 27.99 ms │        23.63 / 23.92 ±0.22 / 24.20 ms │ +1.14x faster │
│ QQuery 41 │        12.40 / 12.57 ±0.14 / 12.76 ms │        11.22 / 12.44 ±2.35 / 17.14 ms │     no change │
│ QQuery 42 │        24.89 / 25.22 ±0.20 / 25.48 ms │        23.32 / 23.94 ±0.60 / 24.96 ms │ +1.05x faster │
│ QQuery 43 │          6.20 / 7.36 ±2.15 / 11.65 ms │           5.36 / 5.47 ±0.16 / 5.79 ms │ +1.34x faster │
│ QQuery 44 │        10.59 / 11.81 ±1.97 / 15.73 ms │           9.49 / 9.59 ±0.11 / 9.78 ms │ +1.23x faster │
│ QQuery 45 │        48.80 / 49.91 ±0.80 / 50.84 ms │        37.88 / 38.76 ±0.70 / 39.82 ms │ +1.29x faster │
│ QQuery 46 │        13.11 / 13.53 ±0.28 / 13.94 ms │        11.69 / 12.06 ±0.37 / 12.53 ms │ +1.12x faster │
│ QQuery 47 │     277.73 / 281.33 ±3.43 / 286.02 ms │     221.33 / 224.62 ±2.93 / 229.68 ms │ +1.25x faster │
│ QQuery 48 │     100.28 / 103.09 ±3.72 / 110.45 ms │       94.94 / 97.23 ±3.84 / 104.85 ms │ +1.06x faster │
│ QQuery 49 │        75.23 / 76.42 ±1.36 / 78.97 ms │        70.46 / 71.00 ±0.38 / 71.56 ms │ +1.08x faster │
│ QQuery 50 │        61.49 / 61.88 ±0.41 / 62.53 ms │        58.38 / 58.72 ±0.19 / 58.92 ms │ +1.05x faster │
│ QQuery 51 │      98.09 / 100.70 ±3.07 / 106.63 ms │        92.46 / 94.31 ±1.95 / 97.72 ms │ +1.07x faster │
│ QQuery 52 │        25.39 / 25.61 ±0.17 / 25.87 ms │        23.55 / 23.74 ±0.22 / 24.15 ms │ +1.08x faster │
│ QQuery 53 │        30.37 / 30.54 ±0.14 / 30.74 ms │        28.56 / 29.06 ±0.62 / 30.28 ms │     no change │
│ QQuery 54 │        57.90 / 61.58 ±4.36 / 67.02 ms │        53.89 / 54.43 ±0.45 / 55.15 ms │ +1.13x faster │
│ QQuery 55 │        24.74 / 25.18 ±0.36 / 25.72 ms │        23.04 / 23.23 ±0.19 / 23.57 ms │ +1.08x faster │
│ QQuery 56 │        42.45 / 42.96 ±0.44 / 43.48 ms │        38.01 / 38.65 ±0.57 / 39.66 ms │ +1.11x faster │
│ QQuery 57 │     189.62 / 192.07 ±1.51 / 194.17 ms │     173.20 / 174.32 ±0.77 / 175.55 ms │ +1.10x faster │
│ QQuery 58 │     116.65 / 117.40 ±0.54 / 118.02 ms │     110.26 / 111.54 ±1.31 / 113.94 ms │     no change │
│ QQuery 59 │     117.74 / 120.62 ±2.26 / 123.82 ms │     117.22 / 118.92 ±2.79 / 124.48 ms │     no change │
│ QQuery 60 │        39.36 / 39.93 ±0.39 / 40.39 ms │        39.19 / 39.74 ±0.40 / 40.25 ms │     no change │
│ QQuery 61 │        12.53 / 12.64 ±0.14 / 12.92 ms │        12.30 / 12.43 ±0.17 / 12.75 ms │     no change │
│ QQuery 62 │        45.88 / 47.20 ±2.46 / 52.12 ms │        45.64 / 46.11 ±0.59 / 47.26 ms │     no change │
│ QQuery 63 │        28.95 / 30.03 ±1.57 / 33.14 ms │        28.79 / 29.18 ±0.29 / 29.54 ms │     no change │
│ QQuery 64 │     359.19 / 369.74 ±9.48 / 383.50 ms │    364.03 / 376.83 ±12.27 / 398.41 ms │     no change │
│ QQuery 65 │     121.80 / 127.05 ±7.69 / 142.31 ms │     127.64 / 131.25 ±2.40 / 133.98 ms │     no change │
│ QQuery 66 │        81.75 / 83.46 ±2.14 / 87.51 ms │        87.25 / 87.77 ±0.55 / 88.78 ms │  1.05x slower │
│ QQuery 67 │     252.75 / 265.77 ±6.91 / 271.35 ms │     279.48 / 284.99 ±3.45 / 289.89 ms │  1.07x slower │
│ QQuery 68 │        12.07 / 12.53 ±0.41 / 13.15 ms │        13.16 / 13.34 ±0.19 / 13.68 ms │  1.07x slower │
│ QQuery 69 │        57.39 / 57.90 ±0.29 / 58.24 ms │        60.13 / 61.10 ±1.09 / 63.21 ms │  1.06x slower │
│ QQuery 70 │     104.58 / 109.60 ±4.97 / 116.81 ms │     110.90 / 115.71 ±6.19 / 127.82 ms │  1.06x slower │
│ QQuery 71 │        35.16 / 35.52 ±0.20 / 35.76 ms │        37.57 / 37.98 ±0.58 / 39.11 ms │  1.07x slower │
│ QQuery 72 │ 1866.54 / 2024.70 ±96.02 / 2146.01 ms │ 1847.78 / 1949.63 ±98.00 / 2122.77 ms │     no change │
│ QQuery 73 │         9.75 / 10.50 ±0.41 / 10.96 ms │        10.80 / 11.09 ±0.24 / 11.32 ms │  1.06x slower │
│ QQuery 74 │     165.79 / 167.99 ±2.06 / 171.71 ms │    168.48 / 176.40 ±11.02 / 198.17 ms │  1.05x slower │
│ QQuery 75 │     144.78 / 149.05 ±5.44 / 159.30 ms │     146.32 / 149.61 ±4.74 / 158.98 ms │     no change │
│ QQuery 76 │        34.85 / 35.14 ±0.24 / 35.54 ms │        34.72 / 35.09 ±0.28 / 35.51 ms │     no change │
│ QQuery 77 │        61.17 / 61.52 ±0.22 / 61.79 ms │        60.94 / 64.14 ±5.24 / 74.55 ms │     no change │
│ QQuery 78 │     216.87 / 221.91 ±4.47 / 228.48 ms │    219.11 / 229.56 ±14.74 / 258.63 ms │     no change │
│ QQuery 79 │        65.68 / 68.34 ±3.52 / 75.04 ms │        70.92 / 71.76 ±1.24 / 74.18 ms │  1.05x slower │
│ QQuery 80 │      98.95 / 100.15 ±1.46 / 102.96 ms │     105.15 / 107.34 ±2.13 / 110.74 ms │  1.07x slower │
│ QQuery 81 │        25.59 / 25.83 ±0.13 / 25.95 ms │        28.40 / 28.57 ±0.12 / 28.79 ms │  1.11x slower │
│ QQuery 82 │        16.14 / 16.36 ±0.28 / 16.91 ms │        17.49 / 18.87 ±2.09 / 23.02 ms │  1.15x slower │
│ QQuery 83 │        33.67 / 34.01 ±0.30 / 34.47 ms │        36.43 / 36.62 ±0.23 / 37.07 ms │  1.08x slower │
│ QQuery 84 │        29.75 / 32.41 ±2.90 / 36.34 ms │        30.68 / 31.05 ±0.34 / 31.51 ms │     no change │
│ QQuery 85 │     107.76 / 108.54 ±0.75 / 109.88 ms │     108.05 / 112.57 ±5.89 / 123.99 ms │     no change │
│ QQuery 86 │        27.47 / 27.73 ±0.21 / 28.11 ms │        27.68 / 28.59 ±0.85 / 30.16 ms │     no change │
│ QQuery 87 │        69.21 / 71.12 ±2.85 / 76.80 ms │        69.30 / 70.30 ±0.89 / 71.45 ms │     no change │
│ QQuery 88 │        67.45 / 67.91 ±0.28 / 68.31 ms │        67.00 / 70.03 ±5.37 / 80.76 ms │     no change │
│ QQuery 89 │        36.91 / 37.76 ±0.43 / 38.08 ms │        37.33 / 38.48 ±0.82 / 39.51 ms │     no change │
│ QQuery 90 │        17.32 / 17.83 ±0.53 / 18.50 ms │        18.52 / 19.10 ±0.83 / 20.75 ms │  1.07x slower │
│ QQuery 91 │        44.56 / 45.51 ±0.76 / 46.57 ms │        48.00 / 48.40 ±0.37 / 49.07 ms │  1.06x slower │
│ QQuery 92 │        30.99 / 34.25 ±3.98 / 42.06 ms │        32.23 / 32.71 ±0.44 / 33.26 ms │     no change │
│ QQuery 93 │        49.40 / 51.28 ±1.36 / 52.68 ms │        53.66 / 54.70 ±0.86 / 55.80 ms │  1.07x slower │
│ QQuery 94 │        37.40 / 38.14 ±0.48 / 38.68 ms │        41.23 / 42.17 ±0.80 / 43.58 ms │  1.11x slower │
│ QQuery 95 │        79.57 / 80.88 ±1.71 / 84.18 ms │        86.57 / 87.62 ±1.04 / 89.41 ms │  1.08x slower │
│ QQuery 96 │        23.60 / 24.76 ±1.72 / 28.15 ms │        25.21 / 25.34 ±0.13 / 25.54 ms │     no change │
│ QQuery 97 │        51.89 / 53.66 ±1.57 / 56.61 ms │        55.08 / 57.34 ±1.69 / 59.89 ms │  1.07x slower │
│ QQuery 98 │        41.79 / 42.74 ±0.82 / 44.15 ms │        46.75 / 48.39 ±2.14 / 52.60 ms │  1.13x slower │
│ QQuery 99 │        69.60 / 69.96 ±0.19 / 70.15 ms │        70.52 / 72.80 ±1.36 / 74.07 ms │     no change │
└───────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Benchmark Summary                             ┃           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ Total Time (HEAD)                             │ 9830.51ms │
│ Total Time (first-last-preordered-fastpath)   │ 9717.62ms │
│ Average Time (HEAD)                           │   99.30ms │
│ Average Time (first-last-preordered-fastpath) │   98.16ms │
│ Queries Faster                                │        20 │
│ Queries Slower                                │        23 │
│ Queries with No Change                        │        56 │
│ Queries with Failure                          │         0 │
└───────────────────────────────────────────────┴───────────┘

Resource Usage

tpcds — base (merge-base)

Metric Value
Wall time 50.0s
Peak memory 2.0 GiB
Avg memory 1.4 GiB
CPU user 214.6s
CPU sys 5.4s
Peak spill 0 B

tpcds — branch

Metric Value
Wall time 50.0s
Peak memory 1.9 GiB
Avg memory 1.4 GiB
CPU user 214.4s
CPU sys 5.5s
Peak spill 0 B

File an issue against this benchmark runner

@zhuqi-lucas

Copy link
Copy Markdown
Contributor Author

run benchmark tpch tpcds

Thanks @comphead for benchmark, this PR should not affect tpch and tpcds, it may be noise.

@jayzhan211 jayzhan211 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @zhuqi-lucas, LGTM!

@comphead
comphead added this pull request to the merge queue Sep 10, 2026
Merged via the queue into apache:main with commit 4cee381 Sep 10, 2026
41 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core Core DataFusion crate functions Changes to functions implementation optimizer Optimizer rules performance Make DataFusion faster sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

first_value/last_value GroupsAccumulator ignores beneficial input ordering (is_input_pre_ordered)

6 participants