Skip to content

Optimize byte-array dictionary gathering in arrow-row - #12113

Merged
Rich-T-kid merged 2 commits into
apache:mainfrom
JonSnow1807:perf-dictionary-gather-12053
Nov 8, 2026
Merged

Rich-T-kid merged 2 commits into
apache:mainfrom
JonSnow1807:perf-dictionary-gather-12053

Conversation

@JonSnow1807

@JonSnow1807 JonSnow1807 commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Closes #12053.

Rationale for this change

The sparse-dictionary encoding path gathers one dictionary value per input row before encoding. The current gather performs a dynamic MutableArrayData extension for every key, which adds overhead for common string and binary dictionaries.

What changes are included in this PR?

Add typed gather implementations for Utf8, LargeUtf8, Binary, and LargeBinary dictionary values. These build the offsets, value buffer, and validity bitmap directly.

Other value types continue to use the generic MutableArrayData implementation. Offset growth is checked so that overflow continues to reach the existing fallback. The dictionary-gather thresholds are unchanged.

Are these changes tested?

I’ve simplified test_gather_dictionary_byte_values to use StringArray, since the string and binary variants share the same gather implementation. The test still covers sliced keys, null keys, and keys that reference null dictionary values.

All 110 arrow-row library tests pass. Workspace tests, workspace Clippy checks, formatting, and spelling checks also pass.

Performance was measured using the existing prepared 8,192-row string-dictionary benchmark on an Intel Xeon E5-2673 v4, Linux x86_64, with Rust 1.99.1. This benchmark cycles through contiguous key chunks.

Two paired Criterion runs used 50 samples, a one-second warmup, and a three-second measurement period. Execution order was reversed for the second pair. The table reports the average of the two runs’ mean estimates.

Dictionary values Before After Change in mean time
10,000 170.3 µs 174.5 µs +2.5%
32,768 310.8 µs 242.0 µs -22.1%
100,000 318.5 µs 242.9 µs -23.7%
1,000,000 309.4 µs 244.9 µs -20.8%
4,000,000 312.4 µs 240.1 µs -23.1%

The 10,000-value control does not enter the dictionary-gather path and averaged 2.5% slower in these measurements. Individual runs varied by several percent.

The additional dictionary sizes were used through a separate local benchmark patch; they are not included in this implementation diff.

Are there any significant user-facing changes?

No public API or intended result changes.

AI assistance: AI tools assisted with implementation, tests, independent review, and validation. I reviewed the code, tests, and description before submission.

@github-actions github-actions Bot added arrow-row arrow-row crate enhancement New feature/addition labels Nov 7, 2026
@Rich-T-kid

Copy link
Copy Markdown
Contributor

run benchmark row_format
env:
BENCH_FILTER: dictionary

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: row_format

Sharding factor: 1 (1 workers).

Comparing perf-dictionary-gather-12053 (9a086f3) to 8473490 (merge-base) diff

Run configuration
run benchmark row_format
env:
  BENCH_FILTER: dictionary
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

run benchmark row_format
env:
BENCH_FILTER: dictionary

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: row_format

Sharding factor: 1 (1 workers).

Comparing perf-dictionary-gather-12053 (9a086f3) to 8473490 (merge-base) diff

Run configuration
run benchmark row_format
env:
  BENCH_FILTER: dictionary
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@Rich-T-kid
Rich-T-kid self-requested a review November 7, 2026 15:48
@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: row_format

Comparing perf-dictionary-gather-12053 (9a086f3) to 8473490 (merge-base) diff

Run configuration
run benchmark row_format
env:
  BENCH_FILTER: dictionary
shards: 1
Details
group                                                                                                                         base                                   changed
-----                                                                                                                         ----                                   -------
append_rows 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)                 1.00    184.7±1.03µs        ? ?/sec    1.00    184.0±1.55µs        ? ?/sec
append_rows 4096 string_dictionary(10, 0)                                                                                     1.00     48.3±0.06µs        ? ?/sec    1.00     48.2±0.22µs        ? ?/sec
append_rows 4096 string_dictionary(100, 0)                                                                                    1.00     71.7±0.12µs        ? ?/sec    1.01     72.7±0.79µs        ? ?/sec
append_rows 4096 string_dictionary(100, 0.5)                                                                                  1.01     56.6±0.20µs        ? ?/sec    1.00     55.9±0.26µs        ? ?/sec
append_rows 4096 string_dictionary(30, 0)                                                                                     1.01     55.1±0.62µs        ? ?/sec    1.00     54.4±1.38µs        ? ?/sec
append_rows 4096 string_dictionary_low_cardinality(10, 0)                                                                     1.00     21.4±0.06µs        ? ?/sec    1.00     21.4±0.04µs        ? ?/sec
append_rows 4096 string_dictionary_low_cardinality(100, 0)                                                                    1.00     32.0±0.07µs        ? ?/sec    1.00     31.9±0.05µs        ? ?/sec
append_rows 4096 string_dictionary_low_cardinality(30, 0)                                                                     1.00     24.0±0.04µs        ? ?/sec    1.00     24.0±0.19µs        ? ?/sec
convert_columns 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)             1.01    190.5±0.92µs        ? ?/sec    1.00    188.1±1.45µs        ? ?/sec
convert_columns 4096 string_dictionary(10, 0)                                                                                 1.00     49.3±0.07µs        ? ?/sec    1.00     49.5±0.04µs        ? ?/sec
convert_columns 4096 string_dictionary(100, 0)                                                                                1.00     73.7±0.44µs        ? ?/sec    1.00     73.8±0.40µs        ? ?/sec
convert_columns 4096 string_dictionary(100, 0.5)                                                                              1.02     57.1±0.20µs        ? ?/sec    1.00     56.0±0.28µs        ? ?/sec
convert_columns 4096 string_dictionary(30, 0)                                                                                 1.02     56.2±0.63µs        ? ?/sec    1.00     55.3±1.29µs        ? ?/sec
convert_columns 4096 string_dictionary_low_cardinality(10, 0)                                                                 1.00     22.5±0.07µs        ? ?/sec    1.00     22.4±0.14µs        ? ?/sec
convert_columns 4096 string_dictionary_low_cardinality(100, 0)                                                                1.02     33.6±0.09µs        ? ?/sec    1.00     32.8±0.05µs        ? ?/sec
convert_columns 4096 string_dictionary_low_cardinality(30, 0)                                                                 1.00     25.1±0.09µs        ? ?/sec    1.00     25.0±0.04µs        ? ?/sec
convert_columns_prepared 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)    1.03    187.1±1.20µs        ? ?/sec    1.00    182.5±1.47µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(10, 0)                                                                        1.00     48.2±0.06µs        ? ?/sec    1.01     48.5±0.05µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(100, 0)                                                                       1.01     72.3±0.20µs        ? ?/sec    1.00     71.8±0.17µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(100, 0.5)                                                                     1.02     56.4±0.18µs        ? ?/sec    1.00     55.3±0.30µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(30, 0)                                                                        1.00     55.0±0.60µs        ? ?/sec    1.01     55.8±1.36µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary_low_cardinality(10, 0)                                                        1.00     21.5±0.06µs        ? ?/sec    1.00     21.5±0.04µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary_low_cardinality(100, 0)                                                       1.00     32.0±0.05µs        ? ?/sec    1.00     31.9±0.05µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary_low_cardinality(30, 0)                                                        1.00     24.1±0.09µs        ? ?/sec    1.00     24.0±0.05µs        ? ?/sec
convert_columns_prepared 8192 string_dictionary(1000000 values)                                                               1.19    201.6±0.77µs        ? ?/sec    1.00    169.3±0.98µs        ? ?/sec
convert_columns_prepared 8192 string_dictionary(4000000 values)                                                               1.26    204.0±2.01µs        ? ?/sec    1.00    162.3±0.94µs        ? ?/sec
convert_rows 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)                1.00    172.2±0.42µs        ? ?/sec    1.01    174.0±0.66µs        ? ?/sec
convert_rows 4096 string_dictionary(10, 0)                                                                                    1.00     35.7±0.02µs        ? ?/sec    1.00     35.7±0.03µs        ? ?/sec
convert_rows 4096 string_dictionary(100, 0)                                                                                   1.01     63.7±0.10µs        ? ?/sec    1.00     63.2±0.21µs        ? ?/sec
convert_rows 4096 string_dictionary(100, 0.5)                                                                                 1.00     43.7±0.08µs        ? ?/sec    1.30     56.9±0.07µs        ? ?/sec
convert_rows 4096 string_dictionary(30, 0)                                                                                    1.00     44.8±0.03µs        ? ?/sec    1.02     45.7±0.46µs        ? ?/sec
convert_rows 4096 string_dictionary_low_cardinality(10, 0)                                                                    1.04     37.0±1.09µs        ? ?/sec    1.00     35.7±0.03µs        ? ?/sec
convert_rows 4096 string_dictionary_low_cardinality(100, 0)                                                                   1.00     63.3±0.18µs        ? ?/sec    1.00     63.4±0.11µs        ? ?/sec
convert_rows 4096 string_dictionary_low_cardinality(30, 0)                                                                    1.02     44.9±0.15µs        ? ?/sec    1.00     44.1±0.03µs        ? ?/sec

Per-runner information
row_format — shard 1/1

Node: gk3-benchmark-cluster-nap-11fep6rz-1e90e640-9m46

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

uname:

Linux bench-c6709291567-4592-52zhb 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 row_format
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 330.1s
Peak memory 109.2 MiB
Avg memory 23.8 MiB
CPU user 326.1s
CPU sys 0.1s
Peak spill 0 B

branch

Metric Value
Wall time 335.1s
Peak memory 105.5 MiB
Avg memory 19.5 MiB
CPU user 330.3s
CPU sys 0.1s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: row_format

Comparing perf-dictionary-gather-12053 (9a086f3) to 8473490 (merge-base) diff

Run configuration
run benchmark row_format
env:
  BENCH_FILTER: dictionary
shards: 1
Details
group                                                                                                                         base                                   changed
-----                                                                                                                         ----                                   -------
append_rows 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)                 1.00    182.2±0.77µs        ? ?/sec    1.01    184.6±1.40µs        ? ?/sec
append_rows 4096 string_dictionary(10, 0)                                                                                     1.01     48.7±0.05µs        ? ?/sec    1.00     48.3±0.29µs        ? ?/sec
append_rows 4096 string_dictionary(100, 0)                                                                                    1.00     72.8±0.42µs        ? ?/sec    1.00     72.5±0.29µs        ? ?/sec
append_rows 4096 string_dictionary(100, 0.5)                                                                                  1.01     55.5±0.20µs        ? ?/sec    1.00     55.1±0.20µs        ? ?/sec
append_rows 4096 string_dictionary(30, 0)                                                                                     1.01     55.2±0.60µs        ? ?/sec    1.00     54.4±1.27µs        ? ?/sec
append_rows 4096 string_dictionary_low_cardinality(10, 0)                                                                     1.00     21.4±0.17µs        ? ?/sec    1.00     21.4±0.04µs        ? ?/sec
append_rows 4096 string_dictionary_low_cardinality(100, 0)                                                                    1.00     31.9±0.06µs        ? ?/sec    1.00     32.0±0.06µs        ? ?/sec
append_rows 4096 string_dictionary_low_cardinality(30, 0)                                                                     1.00     24.0±0.03µs        ? ?/sec    1.00     24.0±0.05µs        ? ?/sec
convert_columns 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)             1.00    185.9±1.06µs        ? ?/sec    1.01    187.1±1.56µs        ? ?/sec
convert_columns 4096 string_dictionary(10, 0)                                                                                 1.00     49.2±0.05µs        ? ?/sec    1.03     50.6±0.29µs        ? ?/sec
convert_columns 4096 string_dictionary(100, 0)                                                                                1.00     72.1±0.42µs        ? ?/sec    1.05     75.5±0.19µs        ? ?/sec
convert_columns 4096 string_dictionary(100, 0.5)                                                                              1.00     56.3±0.20µs        ? ?/sec    1.00     56.3±0.27µs        ? ?/sec
convert_columns 4096 string_dictionary(30, 0)                                                                                 1.02     56.3±0.71µs        ? ?/sec    1.00     55.3±1.33µs        ? ?/sec
convert_columns 4096 string_dictionary_low_cardinality(10, 0)                                                                 1.00     22.4±0.08µs        ? ?/sec    1.01     22.5±0.09µs        ? ?/sec
convert_columns 4096 string_dictionary_low_cardinality(100, 0)                                                                1.00     32.8±0.05µs        ? ?/sec    1.00     33.0±0.05µs        ? ?/sec
convert_columns 4096 string_dictionary_low_cardinality(30, 0)                                                                 1.00     25.0±0.03µs        ? ?/sec    1.00     25.1±0.05µs        ? ?/sec
convert_columns_prepared 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)    1.00    181.6±1.04µs        ? ?/sec    1.02    185.2±1.46µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(10, 0)                                                                        1.00     48.2±0.15µs        ? ?/sec    1.01     48.5±0.07µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(100, 0)                                                                       1.03     73.8±0.37µs        ? ?/sec    1.00     71.7±0.18µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(100, 0.5)                                                                     1.01     55.4±0.29µs        ? ?/sec    1.00     55.1±0.20µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary(30, 0)                                                                        1.03     56.5±0.64µs        ? ?/sec    1.00     54.8±1.30µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary_low_cardinality(10, 0)                                                        1.03     22.1±0.20µs        ? ?/sec    1.00     21.5±0.05µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary_low_cardinality(100, 0)                                                       1.00     31.9±0.05µs        ? ?/sec    1.00     31.9±0.06µs        ? ?/sec
convert_columns_prepared 4096 string_dictionary_low_cardinality(30, 0)                                                        1.00     24.0±0.03µs        ? ?/sec    1.00     24.0±0.05µs        ? ?/sec
convert_columns_prepared 8192 string_dictionary(1000000 values)                                                               1.20    199.3±1.14µs        ? ?/sec    1.00    165.6±5.23µs        ? ?/sec
convert_columns_prepared 8192 string_dictionary(4000000 values)                                                               1.24    201.1±0.85µs        ? ?/sec    1.00    162.8±0.98µs        ? ?/sec
convert_rows 4096 4096 string_dictionary(20, 0.5), string_dictionary(30, 0), string_dictionary(100, 0), i64(0)                1.00    171.0±0.41µs        ? ?/sec    1.02    174.3±0.74µs        ? ?/sec
convert_rows 4096 string_dictionary(10, 0)                                                                                    1.00     36.2±0.09µs        ? ?/sec    1.00     36.1±0.05µs        ? ?/sec
convert_rows 4096 string_dictionary(100, 0)                                                                                   1.00     63.1±0.08µs        ? ?/sec    1.01     63.9±0.42µs        ? ?/sec
convert_rows 4096 string_dictionary(100, 0.5)                                                                                 1.01     43.3±0.11µs        ? ?/sec    1.00     42.8±0.11µs        ? ?/sec
convert_rows 4096 string_dictionary(30, 0)                                                                                    1.00     45.1±0.16µs        ? ?/sec    1.02     46.1±0.04µs        ? ?/sec
convert_rows 4096 string_dictionary_low_cardinality(10, 0)                                                                    1.00     35.7±0.03µs        ? ?/sec    1.00     35.7±0.05µs        ? ?/sec
convert_rows 4096 string_dictionary_low_cardinality(100, 0)                                                                   1.00     63.3±0.06µs        ? ?/sec    1.01     63.9±0.13µs        ? ?/sec
convert_rows 4096 string_dictionary_low_cardinality(30, 0)                                                                    1.00     44.6±0.02µs        ? ?/sec    1.00     44.8±0.75µs        ? ?/sec

Per-runner information
row_format — shard 1/1

Node: gk3-benchmark-cluster-nap-11fep6rz-4c5b963b-gqsw

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

uname:

Linux bench-c6709292869-4593-ttkxn 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 row_format
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 335.1s
Peak memory 108.9 MiB
Avg memory 23.7 MiB
CPU user 327.0s
CPU sys 0.1s
Peak spill 0 B

branch

Metric Value
Wall time 330.1s
Peak memory 105.5 MiB
Avg memory 19.4 MiB
CPU user 326.3s
CPU sys 0.1s
Peak spill 0 B

File an issue against this benchmark runner

Comment thread arrow-row/src/lib.rs
}

#[test]
fn test_gather_dictionary_byte_values() {

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.

I think we can simplify this test, all binary types go through gather_dictionary_byte_values so just testing the stringArray values is fine

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.

Thanks for reviewing this. I’ve simplified test_gather_dictionary_byte_values to use StringArray, since the string and binary variants share the same gather implementation. The test still covers sliced keys, null keys, and keys that reference null dictionary values.

Comment thread arrow-row/src/lib.rs
}
}

fn gather_dictionary_byte_values<K: ArrowDictionaryKeyType, T: ByteArrayType>(

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.

can we add a small doc comment here

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.

Added a short doc comment to gather_dictionary_byte_values. It explains how the helper gathers values in dictionary-key order, preserves nulls, and returns an error if the accumulated offsets overflow.

@Rich-T-kid Rich-T-kid 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 @JonSnow1807

@Rich-T-kid
Rich-T-kid enabled auto-merge November 8, 2026 04:13
@Rich-T-kid
Rich-T-kid added this pull request to the merge queue Nov 8, 2026
Merged via the queue into apache:main with commit f2d9627 Nov 8, 2026
26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arrow-row arrow-row crate enhancement New feature/addition performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Optimize gather_dictionary_values in arrow-row

3 participants