Skip to content

perf(arrow): coalesce dictionary keys without concat - #11743

Merged
Rich-T-kid merged 8 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/coalescer-dictionary-filter
Nov 6, 2026
Merged

Rich-T-kid merged 8 commits into
apache:mainfrom
Rich-T-kid:rich-T-kid/coalescer-dictionary-filter

Conversation

@Rich-T-kid

@Rich-T-kid Rich-T-kid commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Closes #11719.

Rationale for this change

Dictionary arrays currently use the generic coalescer path, which retains input arrays and calls concat when a batch is emitted. Dictionary-heavy workloads therefore repeat value merging and hashing and keep more input memory alive than necessary.

What changes are included in this PR?

This adds a dictionary-specific in-progress array for byte-array values. It retains zero-copy slices of the key buffers and stores each values Arc once.

Merging distinct values arrays

When every chunk uses the same values Arc, finish reuses it directly. Otherwise, merge_dictionary_values_with_masks marks only the referenced values, builds a local-to-output key mapping for each source, and calls interleave once to write the final values array. This only gathers dictionary values; the stored keys are remapped directly into the final key buffer, with no filtered dictionary arrays or concat in between.

For example, start with three dictionary arrays:

A = DictionaryArray {
    keys:   [3, 1, 4, 0, 2, 1, 3, 4, 0, 2]
    values: ["red", "blue", "green", "black", "orange"]
}

B = DictionaryArray {
    keys:   [2, 0, 3, 1, 0, 2, 1, 3, 2, 0]
    values: ["cyan", "purple", "gray", "gold"]
}

C = DictionaryArray {
    keys:   [4, 2, 1, 3, 0, 4, 1, 2, 3, 0]
    values: ["teal", "red", "purple", "pink", "green"]
}

Each call retains a multi-row key slice in its original local key space:

copy_rows(A, 2, 4) -> (source A, keys [4, 0, 2, 1])
copy_rows(B, 3, 4) -> (source B, keys [1, 0, 2, 1])
copy_rows(C, 1, 5) -> (source C, keys [2, 1, 3, 0, 4])

sources:  0 -> A.values
          1 -> B.values
          2 -> C.values

chunks:   (source 0, [4, 0, 2, 1])
          (source 1, [1, 0, 2, 1])
          (source 2, [2, 1, 3, 0, 4])

At flush, only the referenced values are appended and each local key is mapped to its output position:

output values: ["red", "blue", "green", "orange", "cyan", "purple",
                "gray", "teal", "red", "purple", "pink", "green"]

remaps:  A: 0 -> 0, 1 -> 1, 2 -> 2, 4 -> 3
         B: 0 -> 4, 1 -> 5, 2 -> 6
         C: 0 -> 7, 1 -> 8, 2 -> 9, 3 -> 10, 4 -> 11

output keys: [3, 0, 2, 1, 5, 4, 6, 5, 9, 8, 10, 7, 11]
decoded:     ["orange", "red", "green", "blue", "purple", "cyan", "gray",
              "purple", "purple", "red", "pink", "teal", "green"]

The direct path keeps repeated values from different sources because the 12 referenced values fit the key type. If they did not fit, the fallback would deduplicate the shared values from C:

deduplicated values: ["red", "blue", "green", "orange", "cyan", "purple",
                      "gray", "teal", "pink"]

C remap: 0 -> 7, 1 -> 0, 2 -> 5, 3 -> 8, 4 -> 2

Are these changes tested?

The tests cover shared and distinct values arrays, alternating sources, sparse remapping, null keys, row order, direct values reuse, and key-type overflow fallback.

Two final-head hosted runs show large filter and take gains, smaller interleave gains, and peak memory dropping from 63 MiB to 23 MiB.

Are there any significant user-facing changes?

No.

@github-actions github-actions Bot added the arrow-kernels Crates that transform arrow data (e.g. compute, cast) label Oct 20, 2026
@Rich-T-kid
Rich-T-kid marked this pull request as draft October 20, 2026 18:12
@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/coalescer-dictionary-filter branch 2 times, most recently from cb67d1c to ef2a69c Compare October 20, 2026 20:44
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (ef2a69c) to d58a0fc (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (24e3433) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (ef2a69c) to d58a0fc (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                           base                                   changed
-----                                                           ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001          25.22   174.6±3.72ms        ? ?/sec    1.00      6.9±0.06ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01           1.57      4.9±0.02ms        ? ?/sec    1.00      3.1±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1            1.00      2.8±0.04ms        ? ?/sec    1.00      2.8±0.04ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8            1.09      2.5±0.03ms        ? ?/sec    1.00      2.2±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001        16.01   170.9±3.78ms        ? ?/sec    1.00     10.7±0.09ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01         1.49      5.7±0.02ms        ? ?/sec    1.00      3.8±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1          1.02      3.0±0.03ms        ? ?/sec    1.00      2.9±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8          1.08      2.4±0.03ms        ? ?/sec    1.00      2.2±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001      1.00     58.7±0.55ms        ? ?/sec    1.01     59.5±0.52ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01       1.01     10.1±0.05ms        ? ?/sec    1.00     10.0±0.06ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1        1.04      7.6±0.08ms        ? ?/sec    1.00      7.4±0.07ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8        1.03      5.9±0.05ms        ? ?/sec    1.00      5.7±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001    1.01     69.1±0.50ms        ? ?/sec    1.00     68.6±0.53ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01     1.00      9.7±0.04ms        ? ?/sec    1.00      9.7±0.06ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1      1.00      5.5±0.02ms        ? ?/sec    1.00      5.5±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8      1.01      6.0±0.04ms        ? ?/sec    1.00      5.9±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001            1.00    110.1±4.58ms        ? ?/sec    1.04    115.0±2.07ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01             1.00      5.7±0.07ms        ? ?/sec    1.01      5.8±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1              1.01      3.9±0.04ms        ? ?/sec    1.00      3.9±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8              1.00      2.1±0.02ms        ? ?/sec    1.00      2.1±0.06ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001          1.00    111.9±2.80ms        ? ?/sec    1.06    118.8±1.99ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01           1.00      5.9±0.07ms        ? ?/sec    1.04      6.2±0.08ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1            1.00      3.8±0.04ms        ? ?/sec    1.04      3.9±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8            1.00      2.1±0.02ms        ? ?/sec    1.01      2.1±0.03ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-11mn6c6n-aed7f489-bblw

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

uname:

Linux bench-c6317366221-3723-9fjl8 6.12.94+ #1 SMP Fri Aug 21 08:00:16 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 285.1s
Peak memory 61.9 MiB
Avg memory 19.7 MiB
CPU user 223.7s
CPU sys 57.4s
Peak spill 0 B

branch

Metric Value
Wall time 265.1s
Peak memory 42.8 MiB
Avg memory 17.0 MiB
CPU user 235.8s
CPU sys 23.5s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (24e3433) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           22.19   157.9±7.12ms        ? ?/sec    1.00      7.1±0.16ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            1.56      4.8±0.02ms        ? ?/sec    1.00      3.1±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             1.04      2.8±0.02ms        ? ?/sec    1.00      2.7±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             1.08      2.4±0.03ms        ? ?/sec    1.00      2.2±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         14.02   151.2±6.61ms        ? ?/sec    1.00     10.8±0.19ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          1.50      5.7±0.02ms        ? ?/sec    1.00      3.8±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           1.05      2.9±0.01ms        ? ?/sec    1.00      2.8±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           1.08      2.3±0.02ms        ? ?/sec    1.00      2.2±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          23.71  381.4±22.15ms        ? ?/sec    1.00     16.1±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           1.61     10.5±0.04ms        ? ?/sec    1.00      6.5±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            1.09      6.2±0.02ms        ? ?/sec    1.00      5.7±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            1.07      5.3±0.04ms        ? ?/sec    1.00      5.0±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        21.46  346.9±15.11ms        ? ?/sec    1.00     16.2±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         1.61     10.7±0.10ms        ? ?/sec    1.00      6.6±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          1.05      5.9±0.05ms        ? ?/sec    1.00      5.6±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          1.05      5.1±0.04ms        ? ?/sec    1.00      4.8±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.01     58.3±0.27ms        ? ?/sec    1.00     57.5±0.25ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.01      9.9±0.06ms        ? ?/sec    1.00      9.8±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.06      7.4±0.04ms        ? ?/sec    1.00      7.0±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.04      5.8±0.03ms        ? ?/sec    1.00      5.6±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.00     67.1±0.34ms        ? ?/sec    1.00     66.8±0.32ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.01      9.7±0.03ms        ? ?/sec    1.00      9.6±0.05ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.05      5.6±0.01ms        ? ?/sec    1.00      5.3±0.01ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.02      5.9±0.02ms        ? ?/sec    1.00      5.8±0.03ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.02    133.7±0.60ms        ? ?/sec    1.00    131.1±0.58ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.02     22.2±0.10ms        ? ?/sec    1.00     21.8±0.07ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.05     16.6±0.14ms        ? ?/sec    1.00     15.9±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.02     13.2±0.06ms        ? ?/sec    1.00     12.9±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.02    145.8±0.51ms        ? ?/sec    1.00    143.6±0.41ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.01     20.3±0.07ms        ? ?/sec    1.00     20.1±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.04     11.1±0.03ms        ? ?/sec    1.00     10.6±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.05     12.9±0.06ms        ? ?/sec    1.00     12.3±0.06ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             1.00     90.8±5.33ms        ? ?/sec    1.01     91.5±6.50ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              1.02      5.5±0.02ms        ? ?/sec    1.00      5.4±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               1.06      3.8±0.03ms        ? ?/sec    1.00      3.6±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               1.03      2.0±0.01ms        ? ?/sec    1.00  1982.3±51.59µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           1.00     89.1±4.69ms        ? ?/sec    1.04     93.1±6.19ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            1.02      5.8±0.02ms        ? ?/sec    1.00      5.7±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.06      3.7±0.03ms        ? ?/sec    1.00      3.5±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.03      2.1±0.01ms        ? ?/sec    1.00  1987.0±44.85µs        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            1.06   218.1±13.00ms        ? ?/sec    1.00   206.6±14.56ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             1.05     11.8±0.06ms        ? ?/sec    1.00     11.2±0.05ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              1.15      9.2±0.04ms        ? ?/sec    1.00      8.0±0.09ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              1.01      4.7±0.02ms        ? ?/sec    1.00      4.6±0.12ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          1.05   199.1±10.95ms        ? ?/sec    1.00   190.1±14.34ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           1.08     12.1±0.07ms        ? ?/sec    1.00     11.2±0.07ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            1.13      8.5±0.05ms        ? ?/sec    1.00      7.6±0.10ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            1.00      4.4±0.02ms        ? ?/sec    1.00      4.4±0.10ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-11mn6c6n-356aa77f-8lfj

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

uname:

Linux bench-c6317372967-3725-kprgg 6.12.94+ #1 SMP Fri Aug 21 08:00:16 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 650.1s
Peak memory 63.1 MiB
Avg memory 25.6 MiB
CPU user 488.4s
CPU sys 156.1s
Peak spill 0 B

branch

Metric Value
Wall time 570.1s
Peak memory 45.6 MiB
Avg memory 22.8 MiB
CPU user 506.6s
CPU sys 60.1s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid Rich-T-kid left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I don't love that this is is not type agnostic

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (d7a63c2) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (d7a63c2) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (d7a63c2) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           27.20   138.5±2.12ms        ? ?/sec    1.00      5.1±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            2.55      4.7±0.01ms        ? ?/sec    1.00   1834.5±3.27µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             1.00      2.7±0.02ms        ? ?/sec    1.05      2.8±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             1.00      2.3±0.03ms        ? ?/sec    1.00      2.3±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         16.07   135.1±1.86ms        ? ?/sec    1.00      8.4±0.12ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          2.16      5.6±0.02ms        ? ?/sec    1.00      2.6±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           1.00      2.8±0.02ms        ? ?/sec    1.05      2.9±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           1.00      2.2±0.01ms        ? ?/sec    1.00      2.2±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          28.50   328.8±3.18ms        ? ?/sec    1.00     11.5±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           3.00     10.2±0.04ms        ? ?/sec    1.00      3.4±0.00ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            1.00      5.7±0.05ms        ? ?/sec    1.06      6.1±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            1.00      5.2±0.04ms        ? ?/sec    1.00      5.2±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        26.86   312.4±3.08ms        ? ?/sec    1.00     11.6±0.06ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         2.94     10.7±0.04ms        ? ?/sec    1.00      3.6±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          1.00      5.7±0.04ms        ? ?/sec    1.02      5.8±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          1.00      5.0±0.03ms        ? ?/sec    1.01      5.1±0.04ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.00     57.8±0.20ms        ? ?/sec    1.00     57.7±0.18ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.00      9.8±0.06ms        ? ?/sec    1.00      9.8±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.00      7.1±0.04ms        ? ?/sec    1.02      7.2±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.00      5.6±0.04ms        ? ?/sec    1.02      5.7±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.00     66.7±0.32ms        ? ?/sec    1.00     66.6±0.23ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.00      9.6±0.04ms        ? ?/sec    1.00      9.6±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.00      5.2±0.01ms        ? ?/sec    1.03      5.4±0.01ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.00      5.8±0.03ms        ? ?/sec    1.03      5.9±0.02ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.00    132.6±0.51ms        ? ?/sec    1.00    132.4±0.29ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.02     22.1±0.09ms        ? ?/sec    1.00     21.7±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.00     16.2±0.09ms        ? ?/sec    1.02     16.4±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.00     12.9±0.07ms        ? ?/sec    1.02     13.2±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.00    144.5±0.57ms        ? ?/sec    1.01    146.6±0.41ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.01     20.4±0.08ms        ? ?/sec    1.00     20.1±0.06ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.00     10.7±0.07ms        ? ?/sec    1.00     10.7±0.03ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.00     12.5±0.08ms        ? ?/sec    1.03     12.9±0.07ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             1.00     81.3±1.06ms        ? ?/sec    1.00     81.6±0.99ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              1.00      5.3±0.01ms        ? ?/sec    1.05      5.5±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               1.00      3.6±0.02ms        ? ?/sec    1.03      3.7±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               1.00  1998.3±19.94µs        ? ?/sec    1.00  1992.2±15.25µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           1.00     78.8±0.81ms        ? ?/sec    1.00     78.8±0.62ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            1.00      5.6±0.03ms        ? ?/sec    1.03      5.8±0.01ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.00      3.5±0.02ms        ? ?/sec    1.03      3.6±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.00      2.0±0.02ms        ? ?/sec    1.00      2.0±0.01ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            1.00    184.0±1.30ms        ? ?/sec    1.01    185.3±1.29ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             1.00     11.4±0.08ms        ? ?/sec    1.02     11.7±0.05ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              1.00      8.2±0.08ms        ? ?/sec    1.09      9.0±0.05ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              1.00      4.6±0.05ms        ? ?/sec    1.01      4.7±0.04ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          1.00    171.3±1.28ms        ? ?/sec    1.01    172.9±1.28ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           1.00     11.2±0.08ms        ? ?/sec    1.03     11.5±0.04ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            1.00      7.6±0.08ms        ? ?/sec    1.04      7.9±0.07ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            1.00      4.4±0.04ms        ? ?/sec    1.01      4.4±0.03ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-vaa38lox-43786d54-p5k6

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

uname:

Linux bench-c6332876556-3745-89km9 6.12.94+ #1 SMP Fri Aug 21 08:00:16 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 640.1s
Peak memory 62.1 MiB
Avg memory 24.6 MiB
CPU user 499.4s
CPU sys 135.1s
Peak spill 0 B

branch

Metric Value
Wall time 560.1s
Peak memory 46.0 MiB
Avg memory 22.7 MiB
CPU user 501.9s
CPU sys 52.8s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (d7a63c2) to 01a9917 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           31.63   161.1±2.66ms        ? ?/sec    1.00      5.1±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            2.64      4.9±0.03ms        ? ?/sec    1.00   1850.1±4.66µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             1.00      3.0±0.03ms        ? ?/sec    1.00      3.0±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             1.00      2.4±0.05ms        ? ?/sec    1.01      2.5±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         19.19   161.6±3.15ms        ? ?/sec    1.00      8.4±0.09ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          2.25      5.8±0.04ms        ? ?/sec    1.00      2.6±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           1.00      3.0±0.03ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           1.00      2.3±0.04ms        ? ?/sec    1.01      2.4±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          33.91   391.6±6.03ms        ? ?/sec    1.00     11.5±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           3.12     10.7±0.10ms        ? ?/sec    1.00      3.4±0.00ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            1.00      6.1±0.06ms        ? ?/sec    1.00      6.1±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            1.01      5.6±0.08ms        ? ?/sec    1.00      5.5±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        31.71   372.7±6.89ms        ? ?/sec    1.00     11.8±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         3.03     11.2±0.10ms        ? ?/sec    1.00      3.7±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          1.00      6.0±0.03ms        ? ?/sec    1.01      6.0±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          1.02      5.2±0.07ms        ? ?/sec    1.00      5.1±0.05ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.01     59.4±0.23ms        ? ?/sec    1.00     58.8±0.25ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.00      9.9±0.03ms        ? ?/sec    1.01     10.0±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.00      7.3±0.03ms        ? ?/sec    1.01      7.4±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.00      5.8±0.04ms        ? ?/sec    1.02      5.9±0.05ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.00     67.0±0.23ms        ? ?/sec    1.01     67.7±0.22ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.00      9.6±0.03ms        ? ?/sec    1.00      9.7±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.00      5.5±0.02ms        ? ?/sec    1.00      5.5±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.00      6.0±0.03ms        ? ?/sec    1.02      6.1±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.00    134.2±0.38ms        ? ?/sec    1.00    134.9±0.46ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.00     22.2±0.06ms        ? ?/sec    1.00     22.3±0.07ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.00     16.5±0.08ms        ? ?/sec    1.02     17.0±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.00     13.3±0.08ms        ? ?/sec    1.01     13.5±0.10ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.00    147.3±0.57ms        ? ?/sec    1.01    148.9±0.58ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.00     20.2±0.07ms        ? ?/sec    1.00     20.3±0.06ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.00     10.9±0.04ms        ? ?/sec    1.01     11.0±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.00     12.8±0.07ms        ? ?/sec    1.03     13.1±0.07ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             1.00     97.3±1.95ms        ? ?/sec    1.00     97.5±1.20ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              1.02      5.8±0.06ms        ? ?/sec    1.00      5.7±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               1.00      3.9±0.06ms        ? ?/sec    1.07      4.2±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               1.00      2.1±0.03ms        ? ?/sec    1.01      2.1±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           1.00     94.0±2.39ms        ? ?/sec    1.02     95.6±0.74ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            1.02      6.0±0.06ms        ? ?/sec    1.00      5.9±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.00      3.8±0.04ms        ? ?/sec    1.02      3.9±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.00      2.1±0.03ms        ? ?/sec    1.00      2.1±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            1.01    225.9±7.56ms        ? ?/sec    1.00    222.6±2.06ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             1.00     12.2±0.21ms        ? ?/sec    1.01     12.3±0.05ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              1.00      9.0±0.15ms        ? ?/sec    1.02      9.2±0.11ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              1.00      4.7±0.05ms        ? ?/sec    1.01      4.8±0.03ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          1.02    213.6±3.30ms        ? ?/sec    1.00    209.6±2.11ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           1.02     12.1±0.16ms        ? ?/sec    1.00     11.9±0.10ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            1.00      8.2±0.10ms        ? ?/sec    1.03      8.4±0.07ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            1.02      4.6±0.06ms        ? ?/sec    1.00      4.5±0.04ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-7c3qk7tq-fad8f8c4-49kp

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

uname:

Linux bench-c6332875336-3744-hbpjx 6.12.94+ #1 SMP Fri Aug 21 08:00:16 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 645.1s
Peak memory 61.6 MiB
Avg memory 25.5 MiB
CPU user 480.4s
CPU sys 159.2s
Peak spill 0 B

branch

Metric Value
Wall time 550.1s
Peak memory 44.4 MiB
Avg memory 22.8 MiB
CPU user 489.3s
CPU sys 57.4s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (11659ed) to df4dc3e (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (11659ed) to df4dc3e (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           32.90   167.1±4.27ms        ? ?/sec    1.00      5.1±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            2.98      5.0±0.02ms        ? ?/sec    1.00   1671.2±4.31µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             1.04      3.0±0.04ms        ? ?/sec    1.00      2.9±0.04ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             1.05      2.5±0.03ms        ? ?/sec    1.00      2.4±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         18.68   158.1±6.77ms        ? ?/sec    1.00      8.5±0.08ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          2.44      5.8±0.03ms        ? ?/sec    1.00      2.4±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           1.00      2.9±0.04ms        ? ?/sec    1.05      3.0±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           1.02      2.3±0.02ms        ? ?/sec    1.00      2.3±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          34.81  403.9±18.83ms        ? ?/sec    1.00     11.6±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           3.75     10.7±0.06ms        ? ?/sec    1.00      2.8±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            1.03      6.3±0.03ms        ? ?/sec    1.00      6.1±0.05ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            1.00      5.3±0.03ms        ? ?/sec    1.04      5.5±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        32.08  376.0±16.01ms        ? ?/sec    1.00     11.7±0.06ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         3.55     10.8±0.04ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          1.00      5.7±0.05ms        ? ?/sec    1.03      5.9±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          1.00      5.1±0.03ms        ? ?/sec    1.00      5.1±0.04ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.00     59.2±0.27ms        ? ?/sec    1.00     59.1±0.68ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.00      9.9±0.03ms        ? ?/sec    1.01     10.0±0.04ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.00      7.2±0.03ms        ? ?/sec    1.02      7.3±0.04ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.00      5.7±0.03ms        ? ?/sec    1.02      5.8±0.04ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.00     68.1±0.95ms        ? ?/sec    1.00     67.9±0.44ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.00      9.6±0.04ms        ? ?/sec    1.01      9.8±0.04ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.00      5.5±0.03ms        ? ?/sec    1.02      5.6±0.04ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.00      5.9±0.03ms        ? ?/sec    1.01      6.0±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.01    136.1±0.69ms        ? ?/sec    1.00    134.1±1.38ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.00     22.4±0.05ms        ? ?/sec    1.01     22.5±0.09ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.00     16.5±0.05ms        ? ?/sec    1.01     16.7±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.00     13.2±0.12ms        ? ?/sec    1.01     13.3±0.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.00    148.3±0.92ms        ? ?/sec    1.00    148.0±1.07ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.00     20.3±0.08ms        ? ?/sec    1.01     20.5±0.11ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.00     10.9±0.03ms        ? ?/sec    1.00     10.9±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.01     12.8±0.07ms        ? ?/sec    1.00     12.7±0.10ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             1.03    102.1±2.67ms        ? ?/sec    1.00     99.1±5.06ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              1.00      5.5±0.08ms        ? ?/sec    1.07      5.9±0.10ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               1.00      3.8±0.03ms        ? ?/sec    1.02      3.9±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               1.00      2.1±0.02ms        ? ?/sec    1.04      2.1±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           1.00     97.8±1.29ms        ? ?/sec    1.00     98.1±1.97ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            1.00      5.8±0.05ms        ? ?/sec    1.04      6.0±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.00      3.8±0.04ms        ? ?/sec    1.02      3.8±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.00      2.1±0.02ms        ? ?/sec    1.03      2.1±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            1.00    231.7±6.55ms        ? ?/sec    1.02    236.2±9.22ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             1.04     12.4±0.12ms        ? ?/sec    1.00     11.8±0.10ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              1.00      8.7±0.09ms        ? ?/sec    1.03      9.0±0.09ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              1.00      4.7±0.03ms        ? ?/sec    1.03      4.8±0.03ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          1.02   209.8±13.25ms        ? ?/sec    1.00   206.1±11.77ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           1.00     11.7±0.08ms        ? ?/sec    1.00     11.7±0.08ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            1.00      8.4±0.05ms        ? ?/sec    1.03      8.6±0.05ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            1.00      4.5±0.03ms        ? ?/sec    1.01      4.5±0.03ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-102okzyr-dc479920-2hqj

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

uname:

Linux bench-c6389712156-3839-r84f5 6.12.105+ #1 SMP Sat Sep  5 07:54:11 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 660.2s
Peak memory 60.8 MiB
Avg memory 25.0 MiB
CPU user 494.1s
CPU sys 159.4s
Peak spill 0 B

branch

Metric Value
Wall time 555.1s
Peak memory 45.9 MiB
Avg memory 22.8 MiB
CPU user 491.2s
CPU sys 58.5s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/coalescer-dictionary-filter branch from d4cca08 to 7f46592 Compare October 25, 2026 22:20
@github-actions github-actions Bot added the arrow-core Core crates related to representing arrow data label Oct 25, 2026
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (7f46592) to e7c6d29 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (7f46592) to e7c6d29 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           22.06   147.9±2.72ms        ? ?/sec    1.00      6.7±0.05ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.005           2.24      7.5±0.04ms        ? ?/sec    1.00      3.3±0.00ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            1.00      4.7±0.03ms        ? ?/sec    1.03      4.9±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             1.00      2.7±0.01ms        ? ?/sec    1.05      2.8±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             1.00      2.3±0.02ms        ? ?/sec    1.00      2.3±0.02ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         14.01   144.8±2.01ms        ? ?/sec    1.00     10.3±0.04ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.005         2.02      8.9±0.02ms        ? ?/sec    1.00      4.4±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          1.00      5.6±0.01ms        ? ?/sec    1.01      5.7±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           1.00      2.8±0.03ms        ? ?/sec    1.03      2.9±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           1.00      2.2±0.02ms        ? ?/sec    1.00      2.3±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          22.24   352.1±5.46ms        ? ?/sec    1.00     15.8±0.09ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.005          2.24     16.0±0.08ms        ? ?/sec    1.00      7.1±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           1.00     10.3±0.10ms        ? ?/sec    1.03     10.6±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            1.00      5.9±0.04ms        ? ?/sec    1.04      6.1±0.04ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            1.00      5.2±0.03ms        ? ?/sec    1.02      5.3±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        21.31   331.7±4.73ms        ? ?/sec    1.00     15.6±0.08ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.005        2.35     17.0±0.04ms        ? ?/sec    1.00      7.2±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         1.00     10.5±0.03ms        ? ?/sec    1.05     11.0±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          1.00      5.7±0.02ms        ? ?/sec    1.02      5.8±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          1.01      5.1±0.04ms        ? ?/sec    1.00      5.0±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.00     57.8±0.24ms        ? ?/sec    1.00     57.8±0.23ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.00      9.8±0.02ms        ? ?/sec    1.01      9.9±0.07ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.00      7.4±0.02ms        ? ?/sec    1.00      7.4±0.07ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.00      5.7±0.02ms        ? ?/sec    1.01      5.8±0.06ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.00     66.9±0.23ms        ? ?/sec    1.00     66.7±0.28ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.00      9.7±0.03ms        ? ?/sec    1.00      9.7±0.10ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.02      5.6±0.02ms        ? ?/sec    1.00      5.5±0.06ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.00      5.9±0.02ms        ? ?/sec    1.01      6.0±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.00    131.9±0.29ms        ? ?/sec    1.01    132.7±0.45ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.00     22.1±0.04ms        ? ?/sec    1.01     22.4±0.19ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.02     16.9±0.04ms        ? ?/sec    1.00     16.7±0.16ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.00     13.1±0.05ms        ? ?/sec    1.01     13.2±0.14ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.00    145.9±0.76ms        ? ?/sec    1.00    145.8±0.44ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.00     20.5±0.06ms        ? ?/sec    1.00     20.5±0.20ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.02     11.3±0.04ms        ? ?/sec    1.00     11.1±0.15ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.01     12.8±0.04ms        ? ?/sec    1.00     12.7±0.12ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             1.05     89.3±1.63ms        ? ?/sec    1.00     85.0±1.89ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              1.00      5.4±0.02ms        ? ?/sec    1.02      5.6±0.01ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               1.00      3.7±0.01ms        ? ?/sec    1.02      3.7±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               1.00      2.0±0.01ms        ? ?/sec    1.00      2.0±0.01ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           1.09     88.4±2.26ms        ? ?/sec    1.00     81.3±1.36ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            1.00      5.8±0.02ms        ? ?/sec    1.00      5.8±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.00      3.6±0.01ms        ? ?/sec    1.03      3.7±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.00      2.0±0.01ms        ? ?/sec    1.00      2.0±0.01ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            1.02    197.9±3.58ms        ? ?/sec    1.00    193.6±5.06ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             1.00     11.5±0.03ms        ? ?/sec    1.02     11.7±0.03ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              1.00      8.1±0.04ms        ? ?/sec    1.05      8.5±0.06ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              1.00      4.6±0.02ms        ? ?/sec    1.01      4.7±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          1.00    143.4±2.94ms        ? ?/sec    1.24    177.2±2.74ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           1.00     11.4±0.07ms        ? ?/sec    1.01     11.5±0.03ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            1.00      7.6±0.03ms        ? ?/sec    1.03      7.9±0.05ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            1.00      4.4±0.02ms        ? ?/sec    1.02      4.5±0.02ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-mswc4tih-e9f02941-sx7r

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

uname:

Linux bench-c6404188040-3853-c86xb 6.12.105+ #1 SMP Sat Sep  5 07:54:11 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 675.2s
Peak memory 62.2 MiB
Avg memory 24.8 MiB
CPU user 531.6s
CPU sys 138.0s
Peak spill 0 B

branch

Metric Value
Wall time 600.1s
Peak memory 45.6 MiB
Avg memory 22.8 MiB
CPU user 541.9s
CPU sys 53.9s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "take: single_dict, 8192, nulls: 0.1, selectivity: 0.001"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (7f46592) to e7c6d29 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: 'take: single_dict, 8192, nulls: 0.1, selectivity: 0.001'
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (7f46592) to e7c6d29 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: 'take: single_dict, 8192, nulls: 0.1, selectivity: 0.001'
shards: 1
Details
group                                                      base                                   changed
-----                                                      ----                                   -------
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.00    214.6±2.09ms        ? ?/sec    1.00    213.8±1.91ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-qrtsme6q-e87259ad-854z

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

uname:

Linux bench-c6404656555-3854-k8zdx 6.12.105+ #1 SMP Sat Sep  5 07:54:11 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 40.0s
Peak memory 36.8 MiB
Avg memory 19.6 MiB
CPU user 14.4s
CPU sys 18.9s
Peak spill 0 B

branch

Metric Value
Wall time 35.0s
Peak memory 38.2 MiB
Avg memory 22.1 MiB
CPU user 13.3s
CPU sys 18.8s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/coalescer-dictionary-filter branch from 7f46592 to 23e5277 Compare October 26, 2026 04:43
@github-actions github-actions Bot removed the arrow-core Core crates related to representing arrow data label Oct 26, 2026

@Rich-T-kid Rich-T-kid left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

since this PR has been through a few iterations thought id point this out

Comment thread arrow-select/src/coalesce/dictionary.rs Resolved
Comment thread arrow-select/src/coalesce/dictionary.rs Resolved
Comment thread arrow-select/src/dictionary.rs Resolved
Comment thread arrow-select/src/coalesce/dictionary.rs Resolved
Comment thread arrow-select/src/coalesce/dictionary.rs Resolved
@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (d87b6e9) to b65bab9 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (d87b6e9) to b65bab9 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@Rich-T-kid

Copy link
Copy Markdown
Contributor Author

run benchmark coalesce_kernels
env:
BENCH_FILTER: "dict"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: coalesce_kernels

Sharding factor: 1 (1 workers).

Comparing rich-T-kid/coalescer-dictionary-filter (d87b6e9) to b65bab9 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (d87b6e9) to b65bab9 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           9.56    136.2±1.63ms        ? ?/sec    1.00     14.3±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.005           2.58      7.5±0.02ms        ? ?/sec    1.00      2.9±0.00ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            3.01      5.0±0.02ms        ? ?/sec    1.00   1650.4±4.46µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             2.74      4.0±0.03ms        ? ?/sec    1.00   1460.6±4.04µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             2.64      2.5±0.01ms        ? ?/sec    1.00    936.4±3.83µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         6.96    135.3±2.02ms        ? ?/sec    1.00     19.4±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.005         1.96      9.0±0.02ms        ? ?/sec    1.00      4.6±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          2.12      5.8±0.04ms        ? ?/sec    1.00      2.7±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           2.34      4.0±0.02ms        ? ?/sec    1.00   1703.9±5.82µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           2.20      2.3±0.01ms        ? ?/sec    1.00   1051.6±3.42µs        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          13.79   325.5±3.75ms        ? ?/sec    1.00     23.6±0.13ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.005          3.45     16.4±0.05ms        ? ?/sec    1.00      4.7±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           3.97     10.7±0.04ms        ? ?/sec    1.00      2.7±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            3.00      8.5±0.04ms        ? ?/sec    1.00      2.8±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            2.69      5.4±0.03ms        ? ?/sec    1.00   1990.9±3.39µs        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        10.11   312.4±3.05ms        ? ?/sec    1.00     30.9±0.15ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.005        2.61     17.2±0.10ms        ? ?/sec    1.00      6.6±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         2.99     11.1±0.07ms        ? ?/sec    1.00      3.7±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          2.67      7.9±0.06ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          2.40      5.2±0.03ms        ? ?/sec    1.00      2.2±0.00ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.05     57.5±0.16ms        ? ?/sec    1.00     54.7±0.17ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.18     10.1±0.02ms        ? ?/sec    1.00      8.5±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.35      7.4±0.02ms        ? ?/sec    1.00      5.4±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.37      5.7±0.01ms        ? ?/sec    1.00      4.1±0.01ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.06     65.8±0.15ms        ? ?/sec    1.00     61.9±0.17ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.01      9.6±0.02ms        ? ?/sec    1.00      9.5±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.00      5.4±0.01ms        ? ?/sec    1.06      5.7±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.30      5.9±0.02ms        ? ?/sec    1.00      4.5±0.01ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.06    131.5±0.39ms        ? ?/sec    1.00    124.5±0.28ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.20     22.5±0.04ms        ? ?/sec    1.00     18.8±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.42     16.8±0.04ms        ? ?/sec    1.00     11.8±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.36     13.0±0.06ms        ? ?/sec    1.00      9.6±0.03ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.08    143.5±0.47ms        ? ?/sec    1.00    132.8±0.25ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.01     20.2±0.06ms        ? ?/sec    1.00     19.9±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.00     10.9±0.02ms        ? ?/sec    1.07     11.6±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.32     12.8±0.05ms        ? ?/sec    1.00      9.7±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             9.12     81.7±0.57ms        ? ?/sec    1.00      9.0±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              2.76      6.7±0.01ms        ? ?/sec    1.00      2.4±0.01ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               2.24      3.5±0.02ms        ? ?/sec    1.00   1567.2±3.21µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               2.41   1965.6±8.77µs        ? ?/sec    1.00    815.9±1.90µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           6.22     79.1±0.63ms        ? ?/sec    1.00     12.7±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            2.29      6.9±0.02ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.99      3.6±0.02ms        ? ?/sec    1.00   1785.3±7.02µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.93   1963.8±8.76µs        ? ?/sec    1.00   1019.0±3.15µs        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            14.88   185.3±1.06ms        ? ?/sec    1.00     12.5±0.12ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             3.44     14.5±0.03ms        ? ?/sec    1.00      4.2±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              2.73      8.2±0.08ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              2.63      4.5±0.02ms        ? ?/sec    1.00   1696.3±5.27µs        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          10.90   172.9±1.11ms        ? ?/sec    1.00     15.9±0.18ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           2.97     14.3±0.05ms        ? ?/sec    1.00      4.8±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            2.46      7.8±0.07ms        ? ?/sec    1.00      3.2±0.01ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            2.10      4.2±0.02ms        ? ?/sec    1.00   1998.1±3.71µs        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-1qhnggp6-da0f0032-pb7s

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

uname:

Linux bench-c6634815685-4457-slxz7 6.12.105+ #1 SMP Sat Sep 19 07:55:25 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 665.1s
Peak memory 61.6 MiB
Avg memory 25.0 MiB
CPU user 528.1s
CPU sys 132.4s
Peak spill 0 B

branch

Metric Value
Wall time 565.1s
Peak memory 25.1 MiB
Avg memory 21.4 MiB
CPU user 562.5s
CPU sys 0.2s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (d87b6e9) to b65bab9 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           11.51   164.5±3.06ms        ? ?/sec    1.00     14.3±0.03ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.005           2.62      7.7±0.07ms        ? ?/sec    1.00      2.9±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            3.02      5.0±0.03ms        ? ?/sec    1.00   1656.4±5.67µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             2.67      4.1±0.06ms        ? ?/sec    1.00  1545.2±11.11µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             2.52      2.5±0.08ms        ? ?/sec    1.00   977.7±11.00µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         8.33    162.6±2.42ms        ? ?/sec    1.00     19.5±0.06ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.005         1.95      9.0±0.07ms        ? ?/sec    1.00      4.6±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          2.09      5.8±0.04ms        ? ?/sec    1.00      2.8±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           2.24      4.0±0.05ms        ? ?/sec    1.00   1784.3±8.62µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           2.21      2.4±0.06ms        ? ?/sec    1.00  1081.2±10.23µs        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          16.62   395.1±7.49ms        ? ?/sec    1.00     23.8±0.14ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.005          3.45     16.5±0.12ms        ? ?/sec    1.00      4.8±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           3.96     10.8±0.09ms        ? ?/sec    1.00      2.7±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            2.97      8.6±0.15ms        ? ?/sec    1.00      2.9±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            2.73      5.6±0.19ms        ? ?/sec    1.00      2.0±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        12.21   380.9±5.96ms        ? ?/sec    1.00     31.2±0.15ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.005        2.62     17.3±0.13ms        ? ?/sec    1.00      6.6±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         2.98     11.1±0.09ms        ? ?/sec    1.00      3.7±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          2.64      8.0±0.13ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          2.41      5.3±0.14ms        ? ?/sec    1.00      2.2±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.05     58.7±0.37ms        ? ?/sec    1.00     56.1±0.58ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.18     10.1±0.03ms        ? ?/sec    1.00      8.5±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.33      7.4±0.03ms        ? ?/sec    1.00      5.6±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.30      5.7±0.03ms        ? ?/sec    1.00      4.4±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.05     66.4±0.42ms        ? ?/sec    1.00     63.4±0.41ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.00      9.6±0.04ms        ? ?/sec    1.00      9.6±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.00      5.6±0.02ms        ? ?/sec    1.05      5.8±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.28      6.0±0.03ms        ? ?/sec    1.00      4.7±0.02ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.06    133.9±0.87ms        ? ?/sec    1.00    126.5±1.08ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.18     22.5±0.06ms        ? ?/sec    1.00     19.1±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.39     16.7±0.04ms        ? ?/sec    1.00     12.1±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.34     13.1±0.05ms        ? ?/sec    1.00      9.8±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.07    144.8±0.76ms        ? ?/sec    1.00    135.8±0.47ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.00     19.9±0.06ms        ? ?/sec    1.02     20.3±0.06ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.00     11.2±0.03ms        ? ?/sec    1.06     11.9±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.30     12.9±0.05ms        ? ?/sec    1.00      9.9±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             11.56   104.4±2.33ms        ? ?/sec    1.00      9.0±0.05ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              2.62      6.6±0.05ms        ? ?/sec    1.00      2.5±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               2.27      3.8±0.05ms        ? ?/sec    1.00  1673.8±31.69µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               2.35      2.0±0.02ms        ? ?/sec    1.00   859.6±13.25µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           7.72     98.8±2.58ms        ? ?/sec    1.00     12.8±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            2.24      6.9±0.06ms        ? ?/sec    1.00      3.1±0.02ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.92      3.6±0.05ms        ? ?/sec    1.00  1888.4±18.07µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.89      2.0±0.02ms        ? ?/sec    1.00  1063.5±14.87µs        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            18.93   236.9±5.09ms        ? ?/sec    1.00     12.5±0.05ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             3.26     14.5±0.07ms        ? ?/sec    1.00      4.5±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              2.69      8.4±0.06ms        ? ?/sec    1.00      3.1±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              2.58      4.5±0.02ms        ? ?/sec    1.00  1747.8±18.46µs        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          13.79   218.9±5.42ms        ? ?/sec    1.00     15.9±0.03ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           2.92     14.4±0.07ms        ? ?/sec    1.00      4.9±0.03ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            2.45      8.1±0.05ms        ? ?/sec    1.00      3.3±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            2.08      4.3±0.03ms        ? ?/sec    1.00      2.1±0.01ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-1qhnggp6-b1096d2e-t57n

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

uname:

Linux bench-c6634817975-4458-h8rrk 6.12.105+ #1 SMP Sat Sep 19 07:55:25 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 685.2s
Peak memory 63.2 MiB
Avg memory 25.6 MiB
CPU user 522.3s
CPU sys 160.1s
Peak spill 0 B

branch

Metric Value
Wall time 570.1s
Peak memory 22.3 MiB
Avg memory 21.3 MiB
CPU user 567.5s
CPU sys 0.2s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: coalesce_kernels

Comparing rich-T-kid/coalescer-dictionary-filter (d87b6e9) to b65bab9 (merge-base) diff

Run configuration
run benchmark coalesce_kernels
env:
  BENCH_FILTER: dict
shards: 1
Details
group                                                            base                                   changed
-----                                                            ----                                   -------
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.001           11.17   159.4±2.31ms        ? ?/sec    1.00     14.3±0.04ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.005           2.65      7.7±0.08ms        ? ?/sec    1.00      2.9±0.00ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.01            3.05      5.1±0.02ms        ? ?/sec    1.00   1658.1±2.88µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.1             2.66      4.1±0.03ms        ? ?/sec    1.00   1538.4±8.50µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0, selectivity: 0.8             2.44      2.4±0.02ms        ? ?/sec    1.00    988.9±8.08µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001         8.10    158.7±2.36ms        ? ?/sec    1.00     19.6±0.06ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.005         1.97      9.1±0.05ms        ? ?/sec    1.00      4.6±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01          2.13      5.9±0.03ms        ? ?/sec    1.00      2.8±0.01ms        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1           2.29      4.0±0.02ms        ? ?/sec    1.00  1764.7±10.73µs        ? ?/sec
filter: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8           2.12      2.3±0.02ms        ? ?/sec    1.00   1088.2±6.47µs        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.001          16.28   388.7±4.68ms        ? ?/sec    1.00     23.9±0.18ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.005          3.52     16.8±0.15ms        ? ?/sec    1.00      4.8±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.01           4.06     11.0±0.05ms        ? ?/sec    1.00      2.7±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.1            3.11      8.8±0.04ms        ? ?/sec    1.00      2.8±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0, selectivity: 0.8            2.69      5.5±0.03ms        ? ?/sec    1.00      2.1±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.001        11.89   371.7±5.28ms        ? ?/sec    1.00     31.3±0.14ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.005        2.63     17.3±0.07ms        ? ?/sec    1.00      6.6±0.03ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.01         2.95     11.0±0.03ms        ? ?/sec    1.00      3.7±0.01ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.1          2.67      8.1±0.03ms        ? ?/sec    1.00      3.0±0.02ms        ? ?/sec
filter: single_dict, 8192, nulls: 0.1, selectivity: 0.8          2.37      5.2±0.03ms        ? ?/sec    1.00      2.2±0.01ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.001       1.04     58.5±0.48ms        ? ?/sec    1.00     56.3±0.42ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.01        1.19     10.1±0.03ms        ? ?/sec    1.00      8.5±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.1         1.39      7.6±0.06ms        ? ?/sec    1.00      5.5±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0, selectivity: 0.8         1.36      5.8±0.05ms        ? ?/sec    1.00      4.2±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001     1.06     66.8±0.70ms        ? ?/sec    1.00     62.8±0.28ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01      1.00      9.5±0.03ms        ? ?/sec    1.01      9.6±0.03ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1       1.00      5.5±0.02ms        ? ?/sec    1.06      5.8±0.02ms        ? ?/sec
interleave: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8       1.24      5.9±0.04ms        ? ?/sec    1.00      4.8±0.02ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.001      1.05    133.5±1.03ms        ? ?/sec    1.00    127.3±0.96ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.01       1.18     22.3±0.09ms        ? ?/sec    1.00     19.0±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.1        1.42     17.0±0.10ms        ? ?/sec    1.00     11.9±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0, selectivity: 0.8        1.36     13.2±0.11ms        ? ?/sec    1.00      9.7±0.05ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.001    1.09    146.4±0.92ms        ? ?/sec    1.00    135.0±0.71ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.01     1.00     19.9±0.10ms        ? ?/sec    1.01     20.2±0.06ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.1      1.00     11.0±0.03ms        ? ?/sec    1.06     11.7±0.04ms        ? ?/sec
interleave: single_dict, 8192, nulls: 0.1, selectivity: 0.8      1.31     12.8±0.09ms        ? ?/sec    1.00      9.8±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.001             11.17   100.8±2.70ms        ? ?/sec    1.00      9.0±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.01              2.84      7.0±0.09ms        ? ?/sec    1.00      2.5±0.01ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.1               2.28      3.7±0.07ms        ? ?/sec    1.00  1631.7±29.64µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0, selectivity: 0.8               2.47      2.1±0.12ms        ? ?/sec    1.00   849.6±11.74µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.001           7.46     95.3±2.75ms        ? ?/sec    1.00     12.8±0.04ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.01            2.31      7.2±0.07ms        ? ?/sec    1.00      3.1±0.03ms        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.1             1.99      3.7±0.07ms        ? ?/sec    1.00  1860.5±42.88µs        ? ?/sec
take: mixed_dict, 8192, nulls: 0.1, selectivity: 0.8             1.97      2.1±0.12ms        ? ?/sec    1.00  1050.8±12.22µs        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.001            18.40   230.6±5.61ms        ? ?/sec    1.00     12.5±0.06ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.01             3.49     15.2±0.19ms        ? ?/sec    1.00      4.3±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.1              2.69      8.2±0.18ms        ? ?/sec    1.00      3.1±0.03ms        ? ?/sec
take: single_dict, 8192, nulls: 0, selectivity: 0.8              2.69      4.7±0.28ms        ? ?/sec    1.00  1748.4±31.18µs        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.001          13.36   214.6±5.13ms        ? ?/sec    1.00     16.1±0.08ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.01           3.02     14.9±0.15ms        ? ?/sec    1.00      4.9±0.04ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.1            2.48      8.0±0.19ms        ? ?/sec    1.00      3.2±0.02ms        ? ?/sec
take: single_dict, 8192, nulls: 0.1, selectivity: 0.8            2.18      4.5±0.26ms        ? ?/sec    1.00      2.0±0.01ms        ? ?/sec

Per-runner information
coalesce_kernels — shard 1/1

Node: gk3-benchmark-cluster-nap-1qhnggp6-b1096d2e-vwz7

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

uname:

Linux bench-c6634820099-4459-2vmj8 6.12.105+ #1 SMP Sat Sep 19 07:55:25 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench coalesce_kernels
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
Resource Usage

base (merge-base)

Metric Value
Wall time 685.1s
Peak memory 62.2 MiB
Avg memory 25.2 MiB
CPU user 524.6s
CPU sys 154.8s
Peak spill 0 B

branch

Metric Value
Wall time 565.1s
Peak memory 26.1 MiB
Avg memory 21.2 MiB
CPU user 559.5s
CPU sys 0.2s
Peak spill 0 B

File an issue against this benchmark runner

@Rich-T-kid
Rich-T-kid requested a review from Jefffrey November 4, 2026 16:20

@Jefffrey Jefffrey 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.

(identified by codex)

theres a regression for when merging dictionary values that dont point to the same arc, but the underlying array buffers are the same (i.e. via Arc::new(values.clone()) instead of an Arc::clone); see example test:

#[test]
fn coalesce_dictionary_with_shared_buffers_in_separate_arcs() {
    let values = StringArray::from_iter_values((0..128).map(|i| format!("value-{i}")));
    let make_batch = || {
        let dictionary = DictionaryArray::<Int8Type>::new(
            Int8Array::from_iter_values(0..=127),
            // Each call creates a separate Arc, but shares the underlying buffers.
            Arc::new(values.clone()),
        );
        RecordBatch::try_from_iter([("dict", Arc::new(dictionary) as ArrayRef)]).unwrap()
    };

    let first = make_batch();
    let mut coalescer = BatchCoalescer::new(first.schema(), 256);
    coalescer.push_batch(first).unwrap();
    coalescer.push_batch(make_batch()).unwrap();

    let output = coalescer.next_completed_batch().unwrap();
    assert_eq!(output.num_rows(), 256);
    let dictionary = output.column(0).as_dictionary::<Int8Type>();
    let output_values = dictionary.values().as_string::<i32>();
    for (row, key) in dictionary.keys_iter().enumerate() {
        assert_eq!(output_values.value(key.unwrap()), values.value(row % 128));
    }
}

i guess its because currently this PR is checking based on arc equality, and not checking buffer equality of the underlying array the arc points to. it seems we have functionality for that, e.g. here

/// Performs a cheap, pointer-based comparison of two byte array
///
/// See [`ScalarBuffer::ptr_eq`]
fn bytes_ptr_eq<T: ByteArrayType>(a: &dyn Array, b: &dyn Array) -> bool {
match (a.as_bytes_opt::<T>(), b.as_bytes_opt::<T>()) {
(Some(a), Some(b)) => {
let values_eq = a.values().ptr_eq(b.values()) && a.offsets().ptr_eq(b.offsets());
match (a.nulls(), b.nulls()) {
(Some(a), Some(b)) => values_eq && a.inner().ptr_eq(b.inner()),
(None, None) => values_eq,
_ => false,
}
}
_ => false,
}
}

we could fix the check to also consider buffer equality if the arc equality fails, though i wonder if this case should be handled by a fallback anyway during merge 🤔

@Rich-T-kid

Rich-T-kid commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor Author

makes sense, added it in the latest commit.

this may actually be useful for other places where we check the arc-ptr for equality. i guess an easier first solution is to look for places where do arc::new() when it could/should be arc::clone()

@Jefffrey Jefffrey 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

Rich-T-kid added a commit to Rich-T-kid/arrow-rs that referenced this pull request Nov 6, 2026
# Which issue does this PR close?

Follow-up to the pointer identity review on apache#11743.

# Rationale for this change

`Arc::ptr_eq` misses arrays wrapped in different `Arc`s even when they
share the same backing buffers, such as `Arc::new(array.clone())`.

# What changes are included in this PR?

Add a crate-private `child_values_ptr_eq` helper in `arrow-select`. It
checks `Arc` identity first, compares byte-array offsets, values, and
null buffers directly, and falls back to `ArrayData::ptr_eq` for other
types. The helper stays internal for use by apache#11743 without changing the
existing dictionary merge heuristic or adding public API.

# Are these changes tested?

The tests cover same-`Arc` values, shallow clones sharing backing
buffers, empty primitive arrays, and `NullArray`s without allocated
storage. They reject logically equal arrays with independent buffers,
different slices or lengths, different nested children, and different
`StringView` payload buffers. Shared run-end encoded values are also
recognized across different run boundaries.

# Are there any significant user-facing changes?

No.
@Rich-T-kid
Rich-T-kid force-pushed the rich-T-kid/coalescer-dictionary-filter branch from a684be7 to afc7ef9 Compare November 6, 2026 02:31
@Rich-T-kid
Rich-T-kid added this pull request to the merge queue Nov 6, 2026
Merged via the queue into apache:main with commit b3427f5 Nov 6, 2026
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arrow-kernels Crates that transform arrow data (e.g. compute, cast) performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Specialize BatchCoalescer for DictionaryArray

3 participants