Skip to content

perf: bound work over dictionary values by the batch's row count - #26703

Open
jayzhan211 wants to merge 8 commits into
apache:mainfrom
jayzhan211:perf/dictionary-work-bounded-by-rows
Open

jayzhan211 wants to merge 8 commits into
apache:mainfrom
jayzhan211:perf/dictionary-work-bounded-by-rows

Conversation

@jayzhan211

@jayzhan211 jayzhan211 commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

Batches often carry a dictionary with far more values than rows: each batch_size slice of a GROUP BY's output keeps every group's value, and repartitioning and filtering keep the whole dictionary too. Code that processes every dictionary value then does work proportional to the dictionary, not the batch, so queries slow down as the group count grows.

On ClickBench hits_partitioned with datafusion.execution.parquet.enable_rle_to_dictionary = true:

SELECT lower(s), c FROM (
  SELECT "SearchPhrase" s, COUNT(*) c FROM hits WHERE "SearchPhrase" <> '' GROUP BY s
) ORDER BY c DESC LIMIT 10;

takes 13035 ms on main and 1053 ms with this PR: lower runs over every group's value once for each 8192-row output slice. Hashing has the same problem: the hash repartition after a partial aggregate hashes every group's value for each slice (#26696).

What changes are included in this PR?

Code that processes every value of a dictionary now handles at most MAX_DICTIONARY_VALUES_PER_ROW (16) values per row. Past that, it first takes the values the rows reference (take(values, keys) with keys 0..len), which costs O(rows).

  • datafusion_common::utils::map_dictionary_values(array, f) applies f to a dictionary's values within that bound. The string functions that keep dictionaries (ascii, btrim, ltrim, rtrim, lower/upper, character_length, initcap, reverse), Spark hex, array_agg's payload compaction, regexp_replace and substr use it instead of each calling dictionary.with_values(f(values)). regexp_replace and substr keep their own stricter bounds (regexp_replace drops unreferenced values whenever there are more values than rows; substr decodes instead), so their behavior is unchanged.
  • If f fails, map_dictionary_values runs it once more on only the values the rows reference (garbage_collect_any_dictionary). f can see values that no row references, for example values behind null keys or left over from a filter, so without the retry it could fail where running it on each row wouldn't. Of the callers above, only substr can fail because of a particular value (a negative length or a start that overflows).
  • Dictionary hashing (hash_dictionary, hash_dictionary_with_child_hashing) applies the same bound.
  • clippy.toml disallows calling with_values directly, so new code goes through the helper. get_field keeps a direct call because it only picks a child column.

The threshold is set by the cheapest per-value work. lower and upper on ASCII strings convert the whole values buffer at once, so compacting only pays off for them from about 13 values per row; at 9 values per row it made them 1.3x slower. Just above 16 values per row, compacting is faster than processing every value for each of the string functions above (0.76x for lower/upper, 0.44x for ascii, 0.08x to 0.14x for the trims, initcap and reverse) and for hashing (0.31x for short strings and Int64, 0.14x for 64-byte strings). At or below the threshold the code path is unchanged.

#24588 proposes evaluating opt-in functions once per distinct value in ScalarFunctionExpr and keeps the per-function dictionary arms. This PR bounds the cost of those arms and of hashing, so the two don't conflict.

substr's dictionary fast path (#25874) had its own fallback for a value that no row references making substr fail (a negative length on a batch whose rows are all NULL). The helper's retry now covers that case, so the fallback is removed.

Benchmarks

ClickBench hits_partitioned, enable_rle_to_dictionary = true, 12 partitions, release-nonlto, minimum over 3 to 6 interleaved rounds (ms), same results on both:

query main this PR
lower over a dictionary GROUP BY (the query above) 13035 1053
GROUP BY "SearchPhrase" (#26696) 1240 872
GROUP BY arrow_cast("SearchPhrase", 'Utf8') 497 494
MAX(lower("SearchPhrase")) 672 666
GROUP BY "MobilePhoneModel" (low cardinality) 125 124
MAX(lower("MobilePhoneModel")) 167 169

The rest of the #26696 gap (872 ms vs 494 ms for Utf8 keys) is in arrow's concat_dictionaries, which the repartition coalescer uses (apache/arrow-rs#11885), and in the general cost of dictionary group keys (#24822).

with_hashes, 8192-row slices of a dictionary with one value per row of the full array, median of 5 interleaved runs (µs). The committed dictionary_sliced case covers 8 and 32 values per row; the per-type threshold cases were run locally:

case main this PR
short strings, 16 values per row (unchanged path) 107.3 108.4
short strings, just over 16 values per row 107.9 33.3
Int64, just over 16 values per row 32.2 10.0
64-byte strings, just over 16 values per row 310.8 44.1
short strings, 32 values per row 210.8 33.2
Int64, 32 values per row 60.9 9.8
64-byte strings, 32 values per row 616.5 44.5

String functions on an 8192-row slice, both paths timed in one binary (ratio of this PR to main):

function 15 values per row 16 just over 16 20 32
lower / upper 1.00x / 0.99x 1.00x / 1.00x 0.76x / 0.76x 0.62x / 0.61x 0.38x / 0.37x
character_length 1.00x 0.98x 0.56x 0.45x 0.28x
ascii 1.00x 1.01x 0.44x 0.34x 0.21x
btrim / ltrim / rtrim 1.00x 1.00x 0.11x to 0.14x 0.09x to 0.10x 0.06x to 0.07x
initcap / reverse 1.00x 0.98x to 1.00x 0.08x 0.06x to 0.07x 0.04x

The existing dictionary_utf8_int32 cases (100 values per batch) take the unchanged path and stay within noise.

Benchmark bot (12 vCPU), at the current head:

  • clickbench_partitioned with enable_rle_to_dictionary = true on both sides: the bot counts 12 queries as faster. Eleven are 1.26x to 1.91x faster (Q5, Q12–Q14, Q16–Q18, Q33, Q34, Q36, Q39), all grouping on SearchPhrase or URL (Q5 through COUNT(DISTINCT "SearchPhrase")); the twelfth is Q32 at 1.06x, which groups on integer columns this PR doesn't touch. The total goes from 74.0 s to 53.0 s. No query is slower by minimum. An earlier run with an 8-values threshold gave the same picture (72.8 s to 52.4 s).
  • Peak memory for the whole run is higher on the bot in both runs (15.7 GiB vs 13.5 GiB, and 15.4 GiB vs 13.3 GiB before). It reproduces on Linux arm64 with one query per process (dfbench clickbench --query N, 3 runs per side): Q33 peaks about 1.1 GiB higher, and Q16–Q18 and Q34 0.3–0.8 GiB higher. The extra memory is batches waiting in RepartitionExec's output channels. At Q33's peak the repartition reserves 10.3–10.8 GB vs 6.2–6.7 GB on main, while the final aggregate holds 7.5–7.9 GB in both. Hashing no longer slows the senders down, so they get further ahead of the final aggregation. These batches count against the memory pool, so under a memory limit the repartition spills them instead of growing.
  • with_hashes: the dictionary_utf8_int32 cases are flat, and the new dictionary_sliced case takes 53.2 µs at 32 values per row vs 122.5 µs at 8 (the unchanged path). Some cases this PR doesn't touch move by up to 40% in both directions. In both runs, utf8 without nulls is 1.24x–1.40x faster, struct_array 1.15x–1.19x faster, and large_utf8: single, no nulls 1.35x–1.38x slower; the smaller moves differ between runs. Locally they are within 0.96x to 1.01x.

What is the testing strategy for this PR?

  • dictionary.slt: a GROUP BY with batch_size = 1 makes every output slice carry many more dictionary values than rows. The test compares each function above on the grouped dictionary with the same function on the decoded value, including a NULL group, and checks the result stays a dictionary. It also goes through the hash repartition of the partial aggregate's slices.
  • Unit tests: create_hashes_for_dict_slices_with_more_values_than_rows (single and multi-column hashes of slices with null keys and null values match the unsliced hashes), map_dictionary_values_bounds_values_per_row, and map_dictionary_values_fails_only_on_referenced_values (a failing value behind null keys or with no key is ignored, with more rows than Int8 keys can index; a referenced failing value still fails without a retry). string/dictionary_utf8.slt already checks that substr(c, 1, -1) returns NULL on a batch whose rows are all NULL and still errors when a row is referenced; it now goes through the retry.
  • Benchmark: the dictionary_sliced case in datafusion/common/benches/with_hashes.rs.

Are there any user-facing changes?

No behavior changes. datafusion_common::utils gains map_dictionary_values and MAX_DICTIONARY_VALUES_PER_ROW.

@github-actions github-actions Bot added sqllogictest SQL Logic Tests (.slt) common Related to common crate functions Changes to functions implementation spark Changes to datafusion-spark crate labels Oct 24, 2026
@apache apache deleted a comment from adriangbot Oct 24, 2026
@jayzhan211

Copy link
Copy Markdown
Contributor Author

run benchmark clickbench_partitioned
baseline:
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
changed:
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"

@jayzhan211

Copy link
Copy Markdown
Contributor Author

run benchmark with_hashes

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c6382310703-3816-s65nq 6.12.105+ #1 SMP Sat Sep 5 07:54:11 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 perf/dictionary-work-bounded-by-rows (bc3d609) to 039c0b9 (merge-base) diff

Run configuration
run benchmark clickbench_partitioned
baseline:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
changed:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"

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-c6382311015-3817-n986l 6.12.105+ #1 SMP Sat Sep 5 07:54:11 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 perf/dictionary-work-bounded-by-rows (bc3d609) to 039c0b9 (merge-base) diff

Run configuration
run benchmark with_hashes

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 perf/dictionary-work-bounded-by-rows (bc3d609) to 039c0b9 (merge-base) diff

Run configuration
run benchmark clickbench_partitioned
baseline:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
changed:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
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 perf_dictionary-work-bounded-by-rows
--------------------
Benchmark clickbench_partitioned.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃        HEAD ┃ perf_dictionary-work-bounded-by-rows ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 0  │     1.15 ms │                              1.14 ms │     no change │
│ QQuery 1  │    11.49 ms │                             11.34 ms │     no change │
│ QQuery 2  │    35.56 ms │                             35.55 ms │     no change │
│ QQuery 3  │    30.78 ms │                             30.91 ms │     no change │
│ QQuery 4  │   234.56 ms │                            236.66 ms │     no change │
│ QQuery 5  │  1482.61 ms │                           1049.17 ms │ +1.41x faster │
│ QQuery 6  │     1.18 ms │                              1.18 ms │     no change │
│ QQuery 7  │    12.53 ms │                             12.19 ms │     no change │
│ QQuery 8  │   333.81 ms │                            334.15 ms │     no change │
│ QQuery 9  │   467.37 ms │                            472.98 ms │     no change │
│ QQuery 10 │   197.43 ms │                            197.33 ms │     no change │
│ QQuery 11 │   207.59 ms │                            208.24 ms │     no change │
│ QQuery 12 │  1446.45 ms │                           1103.76 ms │ +1.31x faster │
│ QQuery 13 │  2067.76 ms │                           1458.48 ms │ +1.42x faster │
│ QQuery 14 │  1599.21 ms │                           1153.63 ms │ +1.39x faster │
│ QQuery 15 │   289.33 ms │                            289.20 ms │     no change │
│ QQuery 16 │  3551.15 ms │                           2158.61 ms │ +1.65x faster │
│ QQuery 17 │  3624.78 ms │                           2252.81 ms │ +1.61x faster │
│ QQuery 18 │  6741.55 ms │                           3475.06 ms │ +1.94x faster │
│ QQuery 19 │    27.35 ms │                             27.23 ms │     no change │
│ QQuery 20 │  1052.25 ms │                           1040.96 ms │     no change │
│ QQuery 21 │  1359.53 ms │                           1357.17 ms │     no change │
│ QQuery 22 │  3205.28 ms │                           3224.01 ms │     no change │
│ QQuery 23 │  9096.93 ms │                           9210.26 ms │     no change │
│ QQuery 24 │    94.31 ms │                             95.08 ms │     no change │
│ QQuery 25 │   352.08 ms │                            351.54 ms │     no change │
│ QQuery 26 │    96.29 ms │                             96.38 ms │     no change │
│ QQuery 27 │  1133.21 ms │                           1139.24 ms │     no change │
│ QQuery 28 │  3532.15 ms │                           3539.22 ms │     no change │
│ QQuery 29 │    38.35 ms │                             38.69 ms │     no change │
│ QQuery 30 │   541.36 ms │                            543.52 ms │     no change │
│ QQuery 31 │   537.23 ms │                            530.30 ms │     no change │
│ QQuery 32 │  1010.52 ms │                           1012.60 ms │     no change │
│ QQuery 33 │ 13929.17 ms │                           7370.91 ms │ +1.89x faster │
│ QQuery 34 │ 13384.03 ms │                           7356.96 ms │ +1.82x faster │
│ QQuery 35 │   291.63 ms │                            299.83 ms │     no change │
│ QQuery 36 │   171.08 ms │                            132.96 ms │ +1.29x faster │
│ QQuery 37 │    95.52 ms │                             97.18 ms │     no change │
│ QQuery 38 │    79.59 ms │                             83.74 ms │  1.05x slower │
│ QQuery 39 │   392.24 ms │                            287.21 ms │ +1.37x faster │
│ QQuery 40 │    13.90 ms │                             14.98 ms │  1.08x slower │
│ QQuery 41 │    13.04 ms │                             13.63 ms │     no change │
│ QQuery 42 │    12.63 ms │                             12.96 ms │     no change │
└───────────┴─────────────┴──────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                   ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                   │ 72795.97ms │
│ Total Time (perf_dictionary-work-bounded-by-rows)   │ 52358.97ms │
│ Average Time (HEAD)                                 │  1692.93ms │
│ Average Time (perf_dictionary-work-bounded-by-rows) │  1217.65ms │
│ Queries Faster                                      │         11 │
│ Queries Slower                                      │          2 │
│ Queries with No Change                              │         30 │
│ Queries with Failure                                │          0 │
└─────────────────────────────────────────────────────┴────────────┘

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

Comparing HEAD and perf_dictionary-work-bounded-by-rows
--------------------
Benchmark clickbench_partitioned.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                       HEAD ┃   perf_dictionary-work-bounded-by-rows ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 0  │               1.15 / 4.19 ±5.97 / 16.12 ms │           1.14 / 4.28 ±6.14 / 16.56 ms │     no change │
│ QQuery 1  │             11.49 / 11.63 ±0.08 / 11.73 ms │         11.34 / 11.40 ±0.04 / 11.46 ms │     no change │
│ QQuery 2  │             35.56 / 36.10 ±0.30 / 36.45 ms │         35.55 / 35.90 ±0.28 / 36.24 ms │     no change │
│ QQuery 3  │             30.78 / 31.56 ±0.55 / 32.48 ms │         30.91 / 31.47 ±0.48 / 32.14 ms │     no change │
│ QQuery 4  │          234.56 / 239.63 ±3.25 / 242.86 ms │      236.66 / 241.07 ±2.79 / 245.21 ms │     no change │
│ QQuery 5  │      1482.61 / 1500.59 ±17.20 / 1529.29 ms │  1049.17 / 1069.70 ±18.45 / 1093.43 ms │ +1.40x faster │
│ QQuery 6  │                1.18 / 1.34 ±0.25 / 1.84 ms │            1.18 / 1.34 ±0.24 / 1.82 ms │     no change │
│ QQuery 7  │             12.53 / 13.70 ±2.12 / 17.93 ms │         12.19 / 12.51 ±0.21 / 12.83 ms │ +1.09x faster │
│ QQuery 8  │          333.81 / 341.15 ±5.77 / 350.35 ms │     334.15 / 348.48 ±12.64 / 368.59 ms │     no change │
│ QQuery 9  │         467.37 / 480.84 ±11.13 / 498.08 ms │     472.98 / 492.81 ±15.82 / 513.41 ms │     no change │
│ QQuery 10 │          197.43 / 198.62 ±0.97 / 199.92 ms │      197.33 / 198.47 ±1.20 / 200.73 ms │     no change │
│ QQuery 11 │          207.59 / 208.48 ±0.50 / 209.01 ms │      208.24 / 209.58 ±1.13 / 211.44 ms │     no change │
│ QQuery 12 │      1446.45 / 1502.18 ±34.10 / 1547.81 ms │  1103.76 / 1123.47 ±10.75 / 1134.56 ms │ +1.34x faster │
│ QQuery 13 │     2067.76 / 2507.61 ±330.39 / 2927.23 ms │  1458.48 / 1554.76 ±70.77 / 1654.94 ms │ +1.61x faster │
│ QQuery 14 │      1599.21 / 1662.80 ±53.57 / 1752.74 ms │  1153.63 / 1203.12 ±30.99 / 1243.44 ms │ +1.38x faster │
│ QQuery 15 │          289.33 / 298.59 ±9.04 / 314.17 ms │     289.20 / 301.13 ±12.14 / 320.67 ms │     no change │
│ QQuery 16 │     3551.15 / 3675.05 ±145.47 / 3958.93 ms │  2158.61 / 2203.55 ±29.90 / 2251.23 ms │ +1.67x faster │
│ QQuery 17 │      3624.78 / 3728.02 ±86.08 / 3886.03 ms │  2252.81 / 2293.76 ±28.71 / 2334.23 ms │ +1.63x faster │
│ QQuery 18 │     6741.55 / 6845.24 ±117.31 / 7003.43 ms │ 3475.06 / 3736.43 ±175.48 / 3988.60 ms │ +1.83x faster │
│ QQuery 19 │             27.35 / 30.86 ±6.69 / 44.24 ms │        27.23 / 41.32 ±24.89 / 90.97 ms │  1.34x slower │
│ QQuery 20 │       1052.25 / 1056.90 ±3.38 / 1061.33 ms │   1040.96 / 1051.84 ±7.11 / 1062.69 ms │     no change │
│ QQuery 21 │       1359.53 / 1368.79 ±7.17 / 1380.11 ms │   1357.17 / 1365.56 ±4.32 / 1369.60 ms │     no change │
│ QQuery 22 │      3205.28 / 3271.69 ±48.23 / 3346.15 ms │  3224.01 / 3245.74 ±15.59 / 3260.81 ms │     no change │
│ QQuery 23 │     9096.93 / 9418.41 ±223.59 / 9652.59 ms │ 9210.26 / 9405.84 ±156.47 / 9652.43 ms │     no change │
│ QQuery 24 │          94.31 / 106.53 ±22.51 / 151.53 ms │       95.08 / 101.65 ±7.45 / 114.39 ms │     no change │
│ QQuery 25 │          352.08 / 355.22 ±4.46 / 363.93 ms │      351.54 / 354.21 ±2.10 / 357.83 ms │     no change │
│ QQuery 26 │            96.29 / 98.60 ±1.54 / 101.15 ms │        96.38 / 98.00 ±1.57 / 100.68 ms │     no change │
│ QQuery 27 │      1133.21 / 1148.36 ±13.67 / 1169.86 ms │  1139.24 / 1151.80 ±10.44 / 1163.88 ms │     no change │
│ QQuery 28 │      3532.15 / 3562.37 ±29.63 / 3598.71 ms │  3539.22 / 3571.51 ±29.82 / 3618.38 ms │     no change │
│ QQuery 29 │             38.35 / 38.63 ±0.23 / 38.94 ms │        38.69 / 49.05 ±19.73 / 88.50 ms │  1.27x slower │
│ QQuery 30 │          541.36 / 552.33 ±8.61 / 563.61 ms │      543.52 / 549.55 ±4.53 / 557.24 ms │     no change │
│ QQuery 31 │         537.23 / 550.76 ±14.41 / 577.33 ms │      530.30 / 539.78 ±8.53 / 554.16 ms │     no change │
│ QQuery 32 │      1010.52 / 1057.88 ±32.63 / 1092.42 ms │  1012.60 / 1104.91 ±85.83 / 1237.69 ms │     no change │
│ QQuery 33 │  13929.17 / 14376.62 ±517.86 / 15328.74 ms │ 7370.91 / 7512.55 ±142.65 / 7759.59 ms │ +1.91x faster │
│ QQuery 34 │ 13384.03 / 14220.53 ±1084.57 / 16333.16 ms │ 7356.96 / 7607.59 ±176.50 / 7798.57 ms │ +1.87x faster │
│ QQuery 35 │        291.63 / 358.90 ±117.76 / 594.13 ms │     299.83 / 325.80 ±34.02 / 389.95 ms │ +1.10x faster │
│ QQuery 36 │         171.08 / 194.82 ±31.32 / 256.59 ms │      132.96 / 145.01 ±7.54 / 154.59 ms │ +1.34x faster │
│ QQuery 37 │           95.52 / 101.57 ±6.54 / 114.02 ms │        97.18 / 99.77 ±3.29 / 106.10 ms │     no change │
│ QQuery 38 │             79.59 / 81.79 ±1.17 / 83.01 ms │         83.74 / 88.85 ±4.97 / 98.27 ms │  1.09x slower │
│ QQuery 39 │          392.24 / 401.75 ±5.40 / 407.54 ms │      287.21 / 288.94 ±2.69 / 294.31 ms │ +1.39x faster │
│ QQuery 40 │             13.90 / 14.46 ±0.35 / 14.93 ms │         14.98 / 17.10 ±2.63 / 22.14 ms │  1.18x slower │
│ QQuery 41 │             13.04 / 13.27 ±0.15 / 13.46 ms │         13.63 / 17.44 ±4.77 / 25.81 ms │  1.31x slower │
│ QQuery 42 │             12.63 / 15.32 ±5.02 / 25.36 ms │         12.96 / 13.15 ±0.14 / 13.37 ms │ +1.16x faster │
└───────────┴────────────────────────────────────────────┴────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                   ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                   │ 75683.71ms │
│ Total Time (perf_dictionary-work-bounded-by-rows)   │ 53820.17ms │
│ Average Time (HEAD)                                 │  1760.09ms │
│ Average Time (perf_dictionary-work-bounded-by-rows) │  1251.63ms │
│ Queries Faster                                      │         14 │
│ Queries Slower                                      │          5 │
│ Queries with No Change                              │         24 │
│ Queries with Failure                                │          0 │
└─────────────────────────────────────────────────────┴────────────┘

Resource Usage

clickbench_partitioned — base (merge-base)

Metric Value
Wall time 380.1s
Peak memory 13.3 GiB
Avg memory 6.2 GiB
CPU user 3330.8s
CPU sys 199.1s
Peak spill 0 B

clickbench_partitioned — branch

Metric Value
Wall time 270.1s
Peak memory 15.4 GiB
Avg memory 6.3 GiB
CPU user 2147.6s
CPU sys 179.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 perf/dictionary-work-bounded-by-rows (bc3d609) to 039c0b9 (merge-base) diff

Run configuration
run benchmark with_hashes
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

group                                         HEAD                                   perf_dictionary-work-bounded-by-rows
-----                                         ----                                   ------------------------------------
dense_union: multiple, no nulls               1.00     41.6±0.05µs        ? ?/sec    1.00     41.7±0.04µs        ? ?/sec
dense_union: single, no nulls                 1.00     14.2±0.03µs        ? ?/sec    1.01     14.2±0.15µs        ? ?/sec
dense_union_sliced: 1/10 of 81920 rows        1.00     21.8±0.02µs        ? ?/sec    1.00     21.8±0.02µs        ? ?/sec
dense_union_sliced: 1/2 of 16384 rows         1.00     21.7±0.02µs        ? ?/sec    1.00     21.8±0.02µs        ? ?/sec
dense_union_sliced: 1/5 of 40960 rows         1.00     21.7±0.03µs        ? ?/sec    1.01     21.9±0.02µs        ? ?/sec
dictionary_sliced: 1/10 of 81920 values                                              1.00     53.0±0.04µs        ? ?/sec
dictionary_sliced: 1/2 of 16384 values                                               1.00     32.8±0.02µs        ? ?/sec
dictionary_sliced: 1/5 of 40960 values                                               1.00     78.9±0.17µs        ? ?/sec
dictionary_utf8_int32: multiple, no nulls     1.00     10.8±0.01µs        ? ?/sec    1.00     10.8±0.01µs        ? ?/sec
dictionary_utf8_int32: multiple, nulls        1.03     26.4±0.11µs        ? ?/sec    1.00     25.8±0.02µs        ? ?/sec
dictionary_utf8_int32: single, no nulls       1.00      3.2±0.00µs        ? ?/sec    1.01      3.3±0.00µs        ? ?/sec
dictionary_utf8_int32: single, nulls          1.00      8.2±0.02µs        ? ?/sec    1.00      8.2±0.01µs        ? ?/sec
fixed_size_list_array: multiple, no nulls     1.01    106.0±3.75µs        ? ?/sec    1.00    104.6±0.21µs        ? ?/sec
fixed_size_list_array: multiple, nulls        1.00    110.7±0.06µs        ? ?/sec    1.00    110.3±0.25µs        ? ?/sec
fixed_size_list_array: single, no nulls       1.05     34.9±0.28µs        ? ?/sec    1.00     33.4±0.08µs        ? ?/sec
fixed_size_list_array: single, nulls          1.00     37.2±0.06µs        ? ?/sec    1.00     37.2±0.05µs        ? ?/sec
int64: multiple, no nulls                     1.00     11.7±0.01µs        ? ?/sec    1.00     11.7±0.02µs        ? ?/sec
int64: multiple, nulls                        1.00     26.7±0.01µs        ? ?/sec    1.01     26.9±0.05µs        ? ?/sec
int64: single, no nulls                       1.00      3.8±0.01µs        ? ?/sec    1.00      3.8±0.01µs        ? ?/sec
int64: single, nulls                          1.00      8.8±0.01µs        ? ?/sec    1.00      8.7±0.02µs        ? ?/sec
large_utf8: multiple, no nulls                1.06    128.1±0.72µs        ? ?/sec    1.00    121.4±1.16µs        ? ?/sec
large_utf8: multiple, nulls                   1.00    129.7±0.58µs        ? ?/sec    1.03    133.8±0.54µs        ? ?/sec
large_utf8: single, no nulls                  1.00     28.7±0.70µs        ? ?/sec    1.38     39.6±0.10µs        ? ?/sec
large_utf8: single, nulls                     1.00     34.3±0.14µs        ? ?/sec    1.26     43.0±0.59µs        ? ?/sec
list_array: multiple, no nulls                1.03    133.7±3.43µs        ? ?/sec    1.00    130.0±0.19µs        ? ?/sec
list_array: multiple, nulls                   1.00    157.0±0.13µs        ? ?/sec    1.01    158.5±0.18µs        ? ?/sec
list_array: single, no nulls                  1.00     43.2±0.04µs        ? ?/sec    1.01     43.7±0.52µs        ? ?/sec
list_array: single, nulls                     1.00     52.6±0.04µs        ? ?/sec    1.01     53.1±0.05µs        ? ?/sec
list_array_sliced: 1/10 of 81920 rows         1.00     43.2±0.09µs        ? ?/sec    1.00     43.3±0.04µs        ? ?/sec
list_array_sliced: 1/2 of 16384 rows          1.00     43.4±0.09µs        ? ?/sec    1.01     43.7±0.04µs        ? ?/sec
list_array_sliced: 1/5 of 40960 rows          1.04     45.5±1.31µs        ? ?/sec    1.00     43.6±0.16µs        ? ?/sec
list_view_array: multiple, no nulls           1.01    126.5±0.29µs        ? ?/sec    1.00    125.1±0.14µs        ? ?/sec
list_view_array: multiple, nulls              1.00    131.3±0.08µs        ? ?/sec    1.01    132.0±0.30µs        ? ?/sec
list_view_array: single, no nulls             1.00     41.1±0.04µs        ? ?/sec    1.01     41.6±0.43µs        ? ?/sec
list_view_array: single, nulls                1.00     44.0±0.03µs        ? ?/sec    1.01     44.4±0.04µs        ? ?/sec
map_array: multiple, no nulls                 1.00    195.3±0.48µs        ? ?/sec    1.01    196.6±0.32µs        ? ?/sec
map_array: multiple, nulls                    1.00    203.1±0.12µs        ? ?/sec    1.00    204.1±2.23µs        ? ?/sec
map_array: single, no nulls                   1.00     65.2±0.32µs        ? ?/sec    1.01     65.7±0.04µs        ? ?/sec
map_array: single, nulls                      1.00     67.9±0.06µs        ? ?/sec    1.01     68.5±0.20µs        ? ?/sec
map_array_sliced: 1/10 of 81920 rows          1.00     65.2±0.06µs        ? ?/sec    1.01     66.0±0.98µs        ? ?/sec
map_array_sliced: 1/2 of 16384 rows           1.00     65.2±0.05µs        ? ?/sec    1.01     65.7±0.05µs        ? ?/sec
map_array_sliced: 1/5 of 40960 rows           1.01     65.9±0.07µs        ? ?/sec    1.00     65.5±0.09µs        ? ?/sec
mixed: 3 columns (int64, utf8, utf8_view)     1.08     87.7±0.16µs        ? ?/sec    1.00     81.5±0.36µs        ? ?/sec
null: multiple, no nulls                      1.00      2.5±0.03µs        ? ?/sec    1.00      2.5±0.01µs        ? ?/sec
null: single, no nulls                        1.00   1110.9±2.85ns        ? ?/sec    1.00   1109.1±2.76ns        ? ?/sec
run_array_int32: multiple, no nulls           1.00      4.9±0.01µs        ? ?/sec    1.00      4.9±0.01µs        ? ?/sec
run_array_int32: multiple, nulls              1.00      6.7±0.01µs        ? ?/sec    1.00      6.7±0.01µs        ? ?/sec
run_array_int32: single, no nulls             1.00   1805.6±4.79ns        ? ?/sec    1.00   1805.4±3.01ns        ? ?/sec
run_array_int32: single, nulls                1.00      2.3±0.01µs        ? ?/sec    1.00      2.3±0.00µs        ? ?/sec
sparse_union (2 types): multiple, no nulls    1.00     98.2±0.39µs        ? ?/sec    1.00     98.0±0.58µs        ? ?/sec
sparse_union (2 types): single, no nulls      1.03     34.5±1.08µs        ? ?/sec    1.00     33.6±0.43µs        ? ?/sec
sparse_union (utf8): multiple, no nulls       1.01    237.3±1.10µs        ? ?/sec    1.00    234.5±0.95µs        ? ?/sec
sparse_union (utf8): single, no nulls         1.00     79.6±0.32µs        ? ?/sec    1.00     79.3±0.25µs        ? ?/sec
sparse_union: multiple, no nulls              1.02    97.0±11.87µs        ? ?/sec    1.00     94.7±0.42µs        ? ?/sec
sparse_union: single, no nulls                1.00     31.6±0.25µs        ? ?/sec    1.01     32.0±0.52µs        ? ?/sec
sparse_union_sliced: 1/10 of 81920 rows       1.00     31.9±0.70µs        ? ?/sec    1.00     31.8±0.15µs        ? ?/sec
sparse_union_sliced: 1/2 of 16384 rows        1.00     31.5±0.14µs        ? ?/sec    1.00     31.3±0.15µs        ? ?/sec
sparse_union_sliced: 1/5 of 40960 rows        1.00     31.7±0.31µs        ? ?/sec    1.01     31.9±0.29µs        ? ?/sec
struct_array: multiple, no nulls              1.19    178.9±0.52µs        ? ?/sec    1.00    150.5±0.82µs        ? ?/sec
struct_array: multiple, nulls                 1.18    196.1±0.84µs        ? ?/sec    1.00    166.5±0.52µs        ? ?/sec
struct_array: single, no nulls                1.17     60.3±0.16µs        ? ?/sec    1.00     51.7±7.61µs        ? ?/sec
struct_array: single, nulls                   1.17     65.6±0.21µs        ? ?/sec    1.00     56.0±0.29µs        ? ?/sec
utf8: multiple, no nulls                      1.24    142.6±0.46µs        ? ?/sec    1.00    114.9±0.46µs        ? ?/sec
utf8: multiple, nulls                         1.18    161.1±0.98µs        ? ?/sec    1.00    136.0±0.69µs        ? ?/sec
utf8: single, no nulls                        1.40     40.6±0.20µs        ? ?/sec    1.00     29.1±0.18µs        ? ?/sec
utf8: single, nulls                           1.00     44.1±0.20µs        ? ?/sec    1.02     44.8±0.91µs        ? ?/sec
utf8_view (small): multiple, no nulls         1.00     19.1±0.01µs        ? ?/sec    1.00     19.1±0.03µs        ? ?/sec
utf8_view (small): multiple, nulls            1.02     29.8±0.07µs        ? ?/sec    1.00     29.3±0.02µs        ? ?/sec
utf8_view (small): single, no nulls           1.00      5.0±0.00µs        ? ?/sec    1.00      5.1±0.00µs        ? ?/sec
utf8_view (small): single, nulls              1.00      9.7±0.02µs        ? ?/sec    1.00      9.7±0.01µs        ? ?/sec
utf8_view: multiple, no nulls                 1.00    102.3±0.28µs        ? ?/sec    1.00    101.9±0.35µs        ? ?/sec
utf8_view: multiple, nulls                    1.00    124.2±0.42µs        ? ?/sec    1.00    124.0±0.29µs        ? ?/sec
utf8_view: single, no nulls                   1.00     35.2±0.09µs        ? ?/sec    1.00     35.3±0.10µs        ? ?/sec
utf8_view: single, nulls                      1.02     36.8±0.11µs        ? ?/sec    1.00     36.3±0.29µs        ? ?/sec

Resource Usage

with_hashes — base (merge-base)

Metric Value
Wall time 770.2s
Peak memory 40.8 MiB
Avg memory 34.2 MiB
CPU user 880.9s
CPU sys 0.8s
Peak spill 0 B

with_hashes — branch

Metric Value
Wall time 790.2s
Peak memory 42.7 MiB
Avg memory 35.1 MiB
CPU user 918.5s
CPU sys 0.9s
Peak spill 0 B

File an issue against this benchmark runner

@jayzhan211
jayzhan211 marked this pull request as ready for review October 24, 2026 10:28
@jayzhan211
jayzhan211 marked this pull request as draft October 24, 2026 12:30
@jayzhan211

Copy link
Copy Markdown
Contributor Author

run benchmark clickbench_partitioned
baseline:
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
changed:
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"

@jayzhan211

Copy link
Copy Markdown
Contributor Author

run benchmark with_hashes

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c6384244706-3828-5pqrr 6.12.105+ #1 SMP Sat Sep 5 07:54:11 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 perf/dictionary-work-bounded-by-rows (c459aba) to 039c0b9 (merge-base) diff

Run configuration
run benchmark clickbench_partitioned
baseline:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
changed:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"

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-c6384245088-3829-9tbzc 6.12.105+ #1 SMP Sat Sep 5 07:54:11 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 perf/dictionary-work-bounded-by-rows (c459aba) to 039c0b9 (merge-base) diff

Run configuration
run benchmark with_hashes

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 perf/dictionary-work-bounded-by-rows (c459aba) to 039c0b9 (merge-base) diff

Run configuration
run benchmark clickbench_partitioned
baseline:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
changed:
  env:
    DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
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 perf_dictionary-work-bounded-by-rows
--------------------
Benchmark clickbench_partitioned.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃        HEAD ┃ perf_dictionary-work-bounded-by-rows ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 0  │     1.17 ms │                              1.15 ms │     no change │
│ QQuery 1  │    11.27 ms │                             11.32 ms │     no change │
│ QQuery 2  │    35.24 ms │                             35.62 ms │     no change │
│ QQuery 3  │    31.22 ms │                             31.40 ms │     no change │
│ QQuery 4  │   235.39 ms │                            236.81 ms │     no change │
│ QQuery 5  │  1515.65 ms │                           1094.18 ms │ +1.39x faster │
│ QQuery 6  │     1.17 ms │                              1.18 ms │     no change │
│ QQuery 7  │    12.31 ms │                             12.32 ms │     no change │
│ QQuery 8  │   333.39 ms │                            337.15 ms │     no change │
│ QQuery 9  │   479.08 ms │                            472.68 ms │     no change │
│ QQuery 10 │   199.35 ms │                            200.11 ms │     no change │
│ QQuery 11 │   209.02 ms │                            210.18 ms │     no change │
│ QQuery 12 │  1498.52 ms │                           1112.52 ms │ +1.35x faster │
│ QQuery 13 │  2048.95 ms │                           1526.42 ms │ +1.34x faster │
│ QQuery 14 │  1662.42 ms │                           1205.47 ms │ +1.38x faster │
│ QQuery 15 │   294.08 ms │                            298.70 ms │     no change │
│ QQuery 16 │  3609.72 ms │                           2263.87 ms │ +1.59x faster │
│ QQuery 17 │  3747.63 ms │                           2217.05 ms │ +1.69x faster │
│ QQuery 18 │  6892.81 ms │                           3736.22 ms │ +1.84x faster │
│ QQuery 19 │    27.10 ms │                             27.19 ms │     no change │
│ QQuery 20 │  1050.54 ms │                           1038.77 ms │     no change │
│ QQuery 21 │  1358.81 ms │                           1364.57 ms │     no change │
│ QQuery 22 │  3223.32 ms │                           3219.57 ms │     no change │
│ QQuery 23 │  9263.41 ms │                           9316.74 ms │     no change │
│ QQuery 24 │    95.94 ms │                             94.98 ms │     no change │
│ QQuery 25 │   352.73 ms │                            350.43 ms │     no change │
│ QQuery 26 │    95.88 ms │                             96.92 ms │     no change │
│ QQuery 27 │  1134.83 ms │                           1133.92 ms │     no change │
│ QQuery 28 │  3522.69 ms │                           3504.72 ms │     no change │
│ QQuery 29 │    38.75 ms │                             38.56 ms │     no change │
│ QQuery 30 │   545.35 ms │                            547.09 ms │     no change │
│ QQuery 31 │   541.69 ms │                            524.26 ms │     no change │
│ QQuery 32 │  1065.13 ms │                           1005.78 ms │ +1.06x faster │
│ QQuery 33 │ 13687.03 ms │                           7451.46 ms │ +1.84x faster │
│ QQuery 34 │ 14076.45 ms │                           7387.38 ms │ +1.91x faster │
│ QQuery 35 │   295.85 ms │                            300.27 ms │     no change │
│ QQuery 36 │   171.29 ms │                            135.68 ms │ +1.26x faster │
│ QQuery 37 │    96.34 ms │                             95.96 ms │     no change │
│ QQuery 38 │    80.57 ms │                             84.27 ms │     no change │
│ QQuery 39 │   395.22 ms │                            282.80 ms │ +1.40x faster │
│ QQuery 40 │    14.17 ms │                             13.77 ms │     no change │
│ QQuery 41 │    13.82 ms │                             13.66 ms │     no change │
│ QQuery 42 │    13.26 ms │                             12.80 ms │     no change │
└───────────┴─────────────┴──────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                   ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                   │ 73978.57ms │
│ Total Time (perf_dictionary-work-bounded-by-rows)   │ 53045.92ms │
│ Average Time (HEAD)                                 │  1720.43ms │
│ Average Time (perf_dictionary-work-bounded-by-rows) │  1233.63ms │
│ Queries Faster                                      │         12 │
│ Queries Slower                                      │          0 │
│ Queries with No Change                              │         31 │
│ Queries with Failure                                │          0 │
└─────────────────────────────────────────────────────┴────────────┘

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

Comparing HEAD and perf_dictionary-work-bounded-by-rows
--------------------
Benchmark clickbench_partitioned.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                      HEAD ┃   perf_dictionary-work-bounded-by-rows ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 0  │              1.17 / 4.28 ±6.07 / 16.41 ms │           1.15 / 4.24 ±6.04 / 16.32 ms │     no change │
│ QQuery 1  │            11.27 / 11.44 ±0.18 / 11.77 ms │         11.32 / 11.46 ±0.12 / 11.69 ms │     no change │
│ QQuery 2  │            35.24 / 35.89 ±0.66 / 37.15 ms │         35.62 / 35.90 ±0.21 / 36.22 ms │     no change │
│ QQuery 3  │            31.22 / 32.15 ±1.36 / 34.80 ms │         31.40 / 31.71 ±0.19 / 31.99 ms │     no change │
│ QQuery 4  │         235.39 / 240.93 ±2.94 / 243.52 ms │      236.81 / 241.77 ±3.26 / 245.73 ms │     no change │
│ QQuery 5  │     1515.65 / 1540.32 ±25.16 / 1586.48 ms │  1094.18 / 1110.10 ±13.17 / 1128.44 ms │ +1.39x faster │
│ QQuery 6  │               1.17 / 1.34 ±0.23 / 1.78 ms │            1.18 / 1.34 ±0.24 / 1.81 ms │     no change │
│ QQuery 7  │            12.31 / 12.48 ±0.11 / 12.60 ms │         12.32 / 12.56 ±0.18 / 12.87 ms │     no change │
│ QQuery 8  │         333.39 / 342.43 ±7.88 / 356.90 ms │      337.15 / 340.02 ±2.52 / 343.31 ms │     no change │
│ QQuery 9  │         479.08 / 487.55 ±5.13 / 493.13 ms │     472.68 / 482.44 ±10.12 / 499.64 ms │     no change │
│ QQuery 10 │         199.35 / 202.67 ±5.29 / 213.21 ms │      200.11 / 200.86 ±0.67 / 201.91 ms │     no change │
│ QQuery 11 │         209.02 / 210.23 ±0.73 / 210.97 ms │      210.18 / 210.72 ±0.52 / 211.41 ms │     no change │
│ QQuery 12 │     1498.52 / 1533.20 ±34.09 / 1596.00 ms │  1112.52 / 1142.68 ±28.52 / 1186.19 ms │ +1.34x faster │
│ QQuery 13 │    2048.95 / 2488.82 ±393.43 / 3113.35 ms │  1526.42 / 1584.03 ±35.79 / 1635.46 ms │ +1.57x faster │
│ QQuery 14 │     1662.42 / 1719.91 ±40.81 / 1777.37 ms │  1205.47 / 1242.39 ±35.66 / 1309.34 ms │ +1.38x faster │
│ QQuery 15 │         294.08 / 298.89 ±3.24 / 303.05 ms │      298.70 / 307.43 ±9.69 / 325.99 ms │     no change │
│ QQuery 16 │    3609.72 / 3867.65 ±137.51 / 4009.66 ms │  2263.87 / 2297.81 ±31.25 / 2334.71 ms │ +1.68x faster │
│ QQuery 17 │     3747.63 / 3843.11 ±74.04 / 3942.25 ms │  2217.05 / 2302.45 ±44.28 / 2345.33 ms │ +1.67x faster │
│ QQuery 18 │    6892.81 / 7065.45 ±160.82 / 7292.69 ms │  3736.22 / 3805.22 ±55.69 / 3892.04 ms │ +1.86x faster │
│ QQuery 19 │           27.10 / 35.24 ±15.40 / 66.02 ms │         27.19 / 27.33 ±0.14 / 27.58 ms │ +1.29x faster │
│ QQuery 20 │      1050.54 / 1063.16 ±9.10 / 1073.89 ms │  1038.77 / 1064.25 ±17.63 / 1086.22 ms │     no change │
│ QQuery 21 │      1358.81 / 1366.90 ±6.48 / 1378.16 ms │   1364.57 / 1375.31 ±7.42 / 1384.36 ms │     no change │
│ QQuery 22 │     3223.32 / 3277.39 ±56.74 / 3379.84 ms │  3219.57 / 3300.36 ±99.21 / 3487.52 ms │     no change │
│ QQuery 23 │    9263.41 / 9399.17 ±166.02 / 9718.72 ms │ 9316.74 / 9404.48 ±116.93 / 9632.05 ms │     no change │
│ QQuery 24 │        95.94 / 156.91 ±116.11 / 389.07 ms │     94.98 / 148.98 ±104.80 / 358.55 ms │ +1.05x faster │
│ QQuery 25 │         352.73 / 354.94 ±2.13 / 358.02 ms │      350.43 / 355.22 ±3.84 / 361.58 ms │     no change │
│ QQuery 26 │           95.88 / 98.76 ±3.17 / 104.65 ms │         96.92 / 97.71 ±0.75 / 99.07 ms │     no change │
│ QQuery 27 │      1134.83 / 1142.27 ±4.49 / 1148.55 ms │  1133.92 / 1153.86 ±13.63 / 1170.73 ms │     no change │
│ QQuery 28 │     3522.69 / 3551.04 ±24.51 / 3585.57 ms │  3504.72 / 3543.84 ±33.68 / 3590.91 ms │     no change │
│ QQuery 29 │            38.75 / 46.96 ±9.88 / 60.77 ms │         38.56 / 39.02 ±0.27 / 39.41 ms │ +1.20x faster │
│ QQuery 30 │         545.35 / 548.78 ±3.47 / 555.01 ms │      547.09 / 555.82 ±6.94 / 566.08 ms │     no change │
│ QQuery 31 │        541.69 / 556.83 ±16.94 / 589.79 ms │     524.26 / 557.03 ±26.06 / 583.66 ms │     no change │
│ QQuery 32 │    1065.13 / 1256.06 ±232.56 / 1705.26 ms │  1005.78 / 1067.35 ±44.34 / 1127.33 ms │ +1.18x faster │
│ QQuery 33 │ 13687.03 / 14496.46 ±676.07 / 15320.67 ms │ 7451.46 / 7751.55 ±240.88 / 8101.21 ms │ +1.87x faster │
│ QQuery 34 │ 14076.45 / 15055.05 ±856.04 / 16530.37 ms │ 7387.38 / 7577.98 ±194.05 / 7919.90 ms │ +1.99x faster │
│ QQuery 35 │        295.85 / 323.91 ±33.52 / 387.18 ms │     300.27 / 336.51 ±33.94 / 395.51 ms │     no change │
│ QQuery 36 │        171.29 / 194.41 ±22.42 / 236.04 ms │     135.68 / 150.20 ±10.10 / 163.97 ms │ +1.29x faster │
│ QQuery 37 │            96.34 / 97.78 ±1.15 / 99.58 ms │       95.96 / 100.56 ±3.49 / 106.69 ms │     no change │
│ QQuery 38 │            80.57 / 85.23 ±4.21 / 93.13 ms │         84.27 / 86.72 ±1.67 / 89.52 ms │     no change │
│ QQuery 39 │        395.22 / 407.55 ±13.83 / 433.75 ms │      282.80 / 287.43 ±3.41 / 292.15 ms │ +1.42x faster │
│ QQuery 40 │            14.17 / 14.65 ±0.46 / 15.43 ms │         13.77 / 16.86 ±4.03 / 24.83 ms │  1.15x slower │
│ QQuery 41 │            13.82 / 14.01 ±0.21 / 14.39 ms │         13.66 / 16.48 ±4.77 / 26.00 ms │  1.18x slower │
│ QQuery 42 │            13.26 / 13.39 ±0.08 / 13.50 ms │         12.80 / 12.89 ±0.08 / 13.03 ms │     no change │
└───────────┴───────────────────────────────────────────┴────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                   ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                   │ 77495.59ms │
│ Total Time (perf_dictionary-work-bounded-by-rows)   │ 54392.88ms │
│ Average Time (HEAD)                                 │  1802.22ms │
│ Average Time (perf_dictionary-work-bounded-by-rows) │  1264.95ms │
│ Queries Faster                                      │         15 │
│ Queries Slower                                      │          2 │
│ Queries with No Change                              │         26 │
│ Queries with Failure                                │          0 │
└─────────────────────────────────────────────────────┴────────────┘

Resource Usage

clickbench_partitioned — base (merge-base)

Metric Value
Wall time 390.1s
Peak memory 13.5 GiB
Avg memory 6.1 GiB
CPU user 3364.5s
CPU sys 209.3s
Peak spill 0 B

clickbench_partitioned — branch

Metric Value
Wall time 275.1s
Peak memory 15.7 GiB
Avg memory 6.3 GiB
CPU user 2159.7s
CPU sys 178.4s
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 perf/dictionary-work-bounded-by-rows (c459aba) to 039c0b9 (merge-base) diff

Run configuration
run benchmark with_hashes
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

group                                         HEAD                                   perf_dictionary-work-bounded-by-rows
-----                                         ----                                   ------------------------------------
dense_union: multiple, no nulls               1.00     41.7±0.05µs        ? ?/sec    1.00     41.5±0.14µs        ? ?/sec
dense_union: single, no nulls                 1.00     14.1±0.01µs        ? ?/sec    1.00     14.1±0.02µs        ? ?/sec
dense_union_sliced: 1/10 of 81920 rows        1.00     21.7±0.02µs        ? ?/sec    1.00     21.8±0.03µs        ? ?/sec
dense_union_sliced: 1/2 of 16384 rows         1.00     21.7±0.05µs        ? ?/sec    1.00     21.8±0.03µs        ? ?/sec
dense_union_sliced: 1/5 of 40960 rows         1.00     21.6±0.02µs        ? ?/sec    1.00     21.7±0.02µs        ? ?/sec
dictionary_sliced: 1/32 of 262144 values                                             1.00     53.2±0.04µs        ? ?/sec
dictionary_sliced: 1/8 of 65536 values                                               1.00    122.5±0.41µs        ? ?/sec
dictionary_utf8_int32: multiple, no nulls     1.00     10.8±0.03µs        ? ?/sec    1.00     10.8±0.01µs        ? ?/sec
dictionary_utf8_int32: multiple, nulls        1.01     26.3±0.07µs        ? ?/sec    1.00     26.0±0.05µs        ? ?/sec
dictionary_utf8_int32: single, no nulls       1.00      3.3±0.00µs        ? ?/sec    1.00      3.3±0.00µs        ? ?/sec
dictionary_utf8_int32: single, nulls          1.00      8.1±0.02µs        ? ?/sec    1.02      8.2±0.01µs        ? ?/sec
fixed_size_list_array: multiple, no nulls     1.05    107.8±0.50µs        ? ?/sec    1.00    102.7±2.39µs        ? ?/sec
fixed_size_list_array: multiple, nulls        1.02    110.7±0.15µs        ? ?/sec    1.00    109.0±0.35µs        ? ?/sec
fixed_size_list_array: single, no nulls       1.01     33.7±0.11µs        ? ?/sec    1.00     33.5±0.05µs        ? ?/sec
fixed_size_list_array: single, nulls          1.01     37.2±0.06µs        ? ?/sec    1.00     36.7±0.10µs        ? ?/sec
int64: multiple, no nulls                     1.00     11.7±0.01µs        ? ?/sec    1.00     11.7±0.02µs        ? ?/sec
int64: multiple, nulls                        1.00     26.7±0.02µs        ? ?/sec    1.01     26.9±0.02µs        ? ?/sec
int64: single, no nulls                       1.00      3.8±0.01µs        ? ?/sec    1.00      3.8±0.01µs        ? ?/sec
int64: single, nulls                          1.00      8.8±0.01µs        ? ?/sec    1.00      8.7±0.01µs        ? ?/sec
large_utf8: multiple, no nulls                1.04    128.3±0.72µs        ? ?/sec    1.00    123.2±0.68µs        ? ?/sec
large_utf8: multiple, nulls                   1.00    129.4±0.48µs        ? ?/sec    1.12    144.6±0.86µs        ? ?/sec
large_utf8: single, no nulls                  1.00     29.8±0.29µs        ? ?/sec    1.35     40.2±0.10µs        ? ?/sec
large_utf8: single, nulls                     1.01     34.6±0.28µs        ? ?/sec    1.00     34.3±0.23µs        ? ?/sec
list_array: multiple, no nulls                1.00    128.9±0.10µs        ? ?/sec    1.00    129.0±0.09µs        ? ?/sec
list_array: multiple, nulls                   1.00    157.0±0.09µs        ? ?/sec    1.01    157.8±0.14µs        ? ?/sec
list_array: single, no nulls                  1.07     46.3±0.20µs        ? ?/sec    1.00     43.3±0.06µs        ? ?/sec
list_array: single, nulls                     1.00     52.6±0.04µs        ? ?/sec    1.00     52.8±0.04µs        ? ?/sec
list_array_sliced: 1/10 of 81920 rows         1.00     43.2±0.03µs        ? ?/sec    1.01     43.5±0.03µs        ? ?/sec
list_array_sliced: 1/2 of 16384 rows          1.00     43.6±0.13µs        ? ?/sec    1.00     43.4±0.03µs        ? ?/sec
list_array_sliced: 1/5 of 40960 rows          1.07     46.1±0.39µs        ? ?/sec    1.00     43.0±0.20µs        ? ?/sec
list_view_array: multiple, no nulls           1.00    125.1±0.21µs        ? ?/sec    1.04    129.6±0.73µs        ? ?/sec
list_view_array: multiple, nulls              1.00    132.6±0.15µs        ? ?/sec    1.00    132.5±0.17µs        ? ?/sec
list_view_array: single, no nulls             1.02     42.2±1.49µs        ? ?/sec    1.00     41.6±0.07µs        ? ?/sec
list_view_array: single, nulls                1.01     44.7±0.05µs        ? ?/sec    1.00     44.4±0.05µs        ? ?/sec
map_array: multiple, no nulls                 1.00    193.5±0.23µs        ? ?/sec    1.01    195.1±0.34µs        ? ?/sec
map_array: multiple, nulls                    1.00    202.5±0.19µs        ? ?/sec    1.00    203.0±0.19µs        ? ?/sec
map_array: single, no nulls                   1.00     64.7±0.05µs        ? ?/sec    1.01     65.6±0.25µs        ? ?/sec
map_array: single, nulls                      1.00     67.7±0.09µs        ? ?/sec    1.00     67.9±0.04µs        ? ?/sec
map_array_sliced: 1/10 of 81920 rows          1.00     64.8±0.06µs        ? ?/sec    1.02     66.0±0.16µs        ? ?/sec
map_array_sliced: 1/2 of 16384 rows           1.00     65.0±0.16µs        ? ?/sec    1.01     65.6±0.07µs        ? ?/sec
map_array_sliced: 1/5 of 40960 rows           1.01     65.7±0.22µs        ? ?/sec    1.00     65.4±0.04µs        ? ?/sec
mixed: 3 columns (int64, utf8, utf8_view)     1.09     87.7±0.29µs        ? ?/sec    1.00     80.4±0.66µs        ? ?/sec
null: multiple, no nulls                      1.01      2.5±0.00µs        ? ?/sec    1.00      2.5±0.01µs        ? ?/sec
null: single, no nulls                        1.00   1110.3±2.67ns        ? ?/sec    1.00   1111.1±2.90ns        ? ?/sec
run_array_int32: multiple, no nulls           1.00      4.9±0.01µs        ? ?/sec    1.00      4.9±0.01µs        ? ?/sec
run_array_int32: multiple, nulls              1.00      6.6±0.01µs        ? ?/sec    1.03      6.8±0.02µs        ? ?/sec
run_array_int32: single, no nulls             1.00   1804.9±4.09ns        ? ?/sec    1.00   1811.5±4.00ns        ? ?/sec
run_array_int32: single, nulls                1.00      2.3±0.00µs        ? ?/sec    1.07      2.4±0.00µs        ? ?/sec
sparse_union (2 types): multiple, no nulls    1.00     96.9±0.34µs        ? ?/sec    1.00     97.2±0.48µs        ? ?/sec
sparse_union (2 types): single, no nulls      1.00     32.6±0.12µs        ? ?/sec    1.03     33.6±1.39µs        ? ?/sec
sparse_union (utf8): multiple, no nulls       1.00    235.2±1.24µs        ? ?/sec    1.00    235.9±0.86µs        ? ?/sec
sparse_union (utf8): single, no nulls         1.00     78.4±0.39µs        ? ?/sec    1.01     79.0±0.31µs        ? ?/sec
sparse_union: multiple, no nulls              1.00     93.6±0.63µs        ? ?/sec    1.01     94.9±0.58µs        ? ?/sec
sparse_union: single, no nulls                1.00     31.5±0.20µs        ? ?/sec    1.01     31.9±0.20µs        ? ?/sec
sparse_union_sliced: 1/10 of 81920 rows       1.00     31.8±0.19µs        ? ?/sec    1.00     31.9±0.31µs        ? ?/sec
sparse_union_sliced: 1/2 of 16384 rows        1.01     31.8±0.22µs        ? ?/sec    1.00     31.6±0.27µs        ? ?/sec
sparse_union_sliced: 1/5 of 40960 rows        1.00     31.6±0.24µs        ? ?/sec    1.00     31.7±0.23µs        ? ?/sec
struct_array: multiple, no nulls              1.17    173.8±0.92µs        ? ?/sec    1.00    148.9±0.65µs        ? ?/sec
struct_array: multiple, nulls                 1.18    195.8±2.83µs        ? ?/sec    1.00    166.2±1.10µs        ? ?/sec
struct_array: single, no nulls                1.17     59.4±0.72µs        ? ?/sec    1.00     50.5±0.50µs        ? ?/sec
struct_array: single, nulls                   1.15     63.9±0.41µs        ? ?/sec    1.00     55.6±0.47µs        ? ?/sec
utf8: multiple, no nulls                      1.24    142.6±0.45µs        ? ?/sec    1.00    115.3±0.49µs        ? ?/sec
utf8: multiple, nulls                         1.00    161.4±0.99µs        ? ?/sec    1.00    161.1±0.79µs        ? ?/sec
utf8: single, no nulls                        1.40     41.0±0.12µs        ? ?/sec    1.00     29.2±0.14µs        ? ?/sec
utf8: single, nulls                           1.00     45.3±1.09µs        ? ?/sec    1.01     45.9±2.00µs        ? ?/sec
utf8_view (small): multiple, no nulls         1.00     19.0±0.01µs        ? ?/sec    1.00     19.0±0.01µs        ? ?/sec
utf8_view (small): multiple, nulls            1.01     29.8±0.07µs        ? ?/sec    1.00     29.4±0.02µs        ? ?/sec
utf8_view (small): single, no nulls           1.00      5.0±0.00µs        ? ?/sec    1.00      5.1±0.00µs        ? ?/sec
utf8_view (small): single, nulls              1.00      9.7±0.01µs        ? ?/sec    1.00      9.7±0.01µs        ? ?/sec
utf8_view: multiple, no nulls                 1.05    102.2±0.14µs        ? ?/sec    1.00     97.5±0.16µs        ? ?/sec
utf8_view: multiple, nulls                    1.00    124.2±0.25µs        ? ?/sec    1.00    124.0±0.40µs        ? ?/sec
utf8_view: single, no nulls                   1.14     34.7±0.12µs        ? ?/sec    1.00     30.5±0.05µs        ? ?/sec
utf8_view: single, nulls                      1.00     36.5±0.12µs        ? ?/sec    1.00     36.5±0.07µs        ? ?/sec

Resource Usage

with_hashes — base (merge-base)

Metric Value
Wall time 745.2s
Peak memory 40.5 MiB
Avg memory 35.0 MiB
CPU user 884.3s
CPU sys 0.8s
Peak spill 0 B

with_hashes — branch

Metric Value
Wall time 780.2s
Peak memory 46.2 MiB
Avg memory 38.2 MiB
CPU user 903.5s
CPU sys 0.8s
Peak spill 0 B

File an issue against this benchmark runner

@jayzhan211
jayzhan211 force-pushed the perf/dictionary-work-bounded-by-rows branch from b41cb27 to eab0efb Compare October 25, 2026 10:38
@jayzhan211
jayzhan211 marked this pull request as ready for review October 25, 2026 10:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

common Related to common crate functions Changes to functions implementation spark Changes to datafusion-spark crate sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants