Skip to content

feat(parquet): separate push decoder frontier state from row-group decoding#9804

Open
HippoBaro wants to merge 2 commits intoapache:mainfrom
HippoBaro:frontier_row_group_selection
Open

feat(parquet): separate push decoder frontier state from row-group decoding#9804
HippoBaro wants to merge 2 commits intoapache:mainfrom
HippoBaro:frontier_row_group_selection

Conversation

@HippoBaro
Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

#9697 aims to make staged buffer management in the push decoder more explicit. In doing so, it exposes a structural problem: the logic for deciding whether a row group is still live, skipped, or unreachable is spread across several parts of the decoder.

This matters because row-group-level buffer release depends on a single question having a clear answer: can this row group ever need bytes again? That answer depends on the queued row groups, the remaining selection, the running offset/limit budget, and whether predicates require the decoder to stay conservative. Today, that state is split across multiple components, which makes the release policy difficult to centralize cleanly.

What changes are included in this PR?

This PR introduces a clearer ownership boundary in the push decoder:

  • cross-row-group scan state is now handled by a dedicated frontier/look-ahead mechanism
  • the row-group builder is reduced to current-row-group decode work only
  • offset/limit accounting and row-group selection advancement are centralized around that frontier/builder split

This does not implement row-group-level buffer release directly, but it establishes the structure needed for that follow-up work. It should also make future pruning rules easier to add and maintain.

Are these changes tested?

All existing tests pass, and the refactor adds focused coverage for the extracted budget logic and the frontier-driven try_next_reader path.

Are there any user-facing changes?

None.

@github-actions github-actions Bot added the parquet Changes to the parquet crate label Apr 24, 2026
@HippoBaro HippoBaro force-pushed the frontier_row_group_selection branch from 600500d to 307e4d8 Compare April 24, 2026 05:17
Copy link
Copy Markdown
Contributor

@alamb alamb left a comment

Choose a reason for hiding this comment

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

Thank you @HippoBaro -- I very much like the idea of encapsulating the budget (offset/limit) and the state about what row groups remain into a new structure and I think in general this is headed in the right direction. I had a few suggestions about structure and comments but I think this is pretty close in general

Comment thread parquet/src/arrow/push_decoder/reader_builder/mod.rs
Comment thread parquet/src/arrow/push_decoder/reader_builder/mod.rs Outdated
Comment thread parquet/src/arrow/push_decoder/reader_builder/mod.rs Outdated
Comment thread parquet/src/arrow/push_decoder/reader_builder/mod.rs Outdated
Comment thread parquet/src/arrow/push_decoder/remaining.rs Outdated
Comment thread parquet/src/arrow/push_decoder/remaining.rs Outdated
Comment on lines +158 to +161
let row_count = self.row_group_num_rows(row_group_idx)?;
let selection = self.selection.take_for_row_group(row_count);

match self.classify_queued_row_group(row_count, selection.as_ref()) {
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 wondr if we can encapsulate the logic to "get the next chunk of work into a single function rather than split across three separate functions

For example what if QueuedRowGroupDecision::NeedThis returned the row group index directly -- that way you wouldn't have to check being empty above and down here again.

Also, maybe QueuedRowGroupDecision::NeedThis could simply have a field of NextRowGroup 🤔

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.

Agreed. I reworked this so next_readable_row_group is now the single loop that advances queued row groups until it either finds work or determines there is no more work.

The code is now much nicer 🙇

/// Remaining selection to apply to the next row groups
selection: Option<RowSelection>,
/// Cross-row-group scan state for queued work.
frontier: RowGroupFrontier,
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 you remind me why the datea bout th enext row groups is being encapsulated in RowGroupFontier? Do you have more plans for it in future PRs?

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.

For clearer separation of concerns. The builder now only owns the currently active row group and its decode state, while RowGroupFrontier owns the look-ahead state needed to decide which row group can be handed to the builder next.

This is also the piece that I care about in the context of the PushBuffers work, because it centralizes all the row-group pruning logic, which makes releasing prefetched buffer easy.

match result {
DecodeResult::Finished => {
match self.row_group_reader_builder.try_build()? {
RowGroupBuildResult::Idle => {
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.

WHy the term "Idle" ? Maybe RowGroupBuildResult::Skipped would better match the semantics

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.

This is an intermediary step between Finished and the processing of the next row group. Idle is appropriate is that narrow sense. And Skipped would not be, because we are not skipping anything here.

Your remark makes me think this has to go anyways because it's confusing.: I'll rework the code to just move from Finished to the next state directly instead!

}
DecodeResult::NeedsData(ranges) => {
RowGroupBuildResult::Finished { remaining_budget } => {
self.frontier.advance_budget(remaining_budget);
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 feel like something is not quite right here as both the reader_builder and frontier both have a budget. It seems like this could result in a discrepancy eventually when they don't match (also this is perhaps why there can be an internal error)

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! The frontier owns the cross-row-group budget until it hands a NextRowGroup to the builder and the builder owns that budget only while decoding the active row group, then returns remaining_budget.

No more possibility of corrupted states

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 25, 2026

run benchmark arrow_reader

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4317123476-1839-v9f5p 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux

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

Comparing frontier_row_group_selection (307e4d8) to b93240a (merge-base) diff
BENCH_NAME=arrow_reader
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark completed (GKE) | trigger

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

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

group                                                                                                      frontier_row_group_selection           main
-----                                                                                                      ----------------------------           ----
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                           1.00   848.5±14.80µs        ? ?/sec    1.01   854.4±15.74µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                          1.00    949.7±7.81µs        ? ?/sec    1.00    949.6±7.83µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                            1.00   851.1±16.13µs        ? ?/sec    1.01   857.0±16.73µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, mandatory, no NULLs                                     1.01    278.7±0.60µs        ? ?/sec    1.00    277.2±0.23µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, half NULLs                                    1.01    389.3±0.62µs        ? ?/sec    1.00    384.7±0.81µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, no NULLs                                      1.05    294.1±0.52µs        ? ?/sec    1.00    281.2±0.17µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, mandatory, no NULLs                                          1.00    417.0±3.21µs        ? ?/sec    1.00    416.9±2.89µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, half NULLs                                         1.00    460.1±3.87µs        ? ?/sec    1.01    462.5±3.94µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, no NULLs                                           1.00    414.3±4.66µs        ? ?/sec    1.02    420.6±3.02µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, mandatory, no NULLs                                 1.01     80.3±0.04µs        ? ?/sec    1.00     79.8±0.05µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, half NULLs                                1.04    111.3±0.12µs        ? ?/sec    1.00    107.5±0.13µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, no NULLs                                  1.01     84.0±0.05µs        ? ?/sec    1.00     83.5±0.08µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs                                      1.00    146.9±0.88µs        ? ?/sec    1.00    146.7±0.61µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs, short string                        1.00    141.9±0.69µs        ? ?/sec    1.00    141.7±0.61µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, half NULLs                                     1.01    147.5±0.50µs        ? ?/sec    1.00    146.1±2.29µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, no NULLs                                       1.00    152.1±0.78µs        ? ?/sec    1.00    151.7±0.41µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs     1.14   1092.6±6.75µs        ? ?/sec    1.00    959.7±0.48µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, half NULLs    1.00    670.2±0.53µs        ? ?/sec    1.00    666.9±0.41µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, no NULLs      1.00    968.6±0.72µs        ? ?/sec    1.04  1002.9±12.89µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                 1.02    185.4±0.39µs        ? ?/sec    1.00    182.1±0.44µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                1.00    290.7±0.76µs        ? ?/sec    1.00    289.3±0.43µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                  1.01    191.1±0.40µs        ? ?/sec    1.00    190.0±0.33µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, mandatory, no NULLs        1.00    119.5±0.23µs        ? ?/sec    1.01    120.8±0.27µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, half NULLs       1.00    176.7±0.31µs        ? ?/sec    1.03    181.5±3.32µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, no NULLs         1.00    122.3±0.21µs        ? ?/sec    1.03    125.8±0.21µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, mandatory, no NULLs                    1.00     60.3±0.16µs        ? ?/sec    1.06     63.8±3.48µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, half NULLs                   1.00    147.0±0.22µs        ? ?/sec    1.01    148.3±1.49µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, no NULLs                     1.00     63.2±0.16µs        ? ?/sec    1.01     64.1±0.18µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, mandatory, no NULLs                    1.00    799.5±0.48µs        ? ?/sec    1.00    800.6±0.53µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, half NULLs                   1.00    509.7±0.45µs        ? ?/sec    1.00    509.8±0.42µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, no NULLs                     1.00    802.6±0.92µs        ? ?/sec    1.00    804.2±2.27µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, mandatory, no NULLs                                1.00     22.8±0.05µs        ? ?/sec    1.01     23.1±0.05µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, half NULLs                               1.00    129.4±0.28µs        ? ?/sec    1.01    130.2±0.18µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, no NULLs                                 1.00     26.6±0.07µs        ? ?/sec    1.04     27.8±0.26µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, mandatory, no NULLs                     1.00     65.0±0.15µs        ? ?/sec    1.04     67.8±4.51µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, half NULLs                    1.00    123.5±0.18µs        ? ?/sec    1.00    123.6±0.32µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, no NULLs                      1.00     68.7±0.12µs        ? ?/sec    1.00     69.0±0.17µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, mandatory, no NULLs                                 1.00      5.4±0.01µs        ? ?/sec    1.02      5.5±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, half NULLs                                1.00     93.2±0.11µs        ? ?/sec    1.00     93.4±0.08µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, no NULLs                                  1.01      8.9±0.01µs        ? ?/sec    1.00      8.8±0.03µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, mandatory, no NULLs                     1.00    129.9±0.37µs        ? ?/sec    1.01    131.1±0.34µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, half NULLs                    1.00    188.5±0.42µs        ? ?/sec    1.00    189.2±0.24µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, no NULLs                      1.01    135.7±1.18µs        ? ?/sec    1.00    135.0±0.41µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, mandatory, no NULLs                                 1.00      7.5±0.01µs        ? ?/sec    1.02      7.7±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, half NULLs                                1.00    126.8±0.11µs        ? ?/sec    1.01    127.6±0.11µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, no NULLs                                  1.00     11.0±0.01µs        ? ?/sec    1.01     11.2±0.03µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, mandatory, no NULLs                     1.00    266.7±0.63µs        ? ?/sec    1.00    265.4±1.05µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, half NULLs                    1.00    248.3±0.45µs        ? ?/sec    1.00    249.3±0.33µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, no NULLs                      1.00    269.1±0.81µs        ? ?/sec    1.00    269.5±0.91µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, mandatory, no NULLs                                 1.00     12.1±0.02µs        ? ?/sec    1.00     12.1±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, half NULLs                                1.00    122.6±0.18µs        ? ?/sec    1.00    122.9±0.13µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, no NULLs                                  1.01     16.5±0.05µs        ? ?/sec    1.00     16.3±0.03µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed increasing value                                    1.02     87.8±0.36µs        ? ?/sec    1.00     86.5±0.42µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed single value                                        1.01     79.4±0.57µs        ? ?/sec    1.00     78.3±0.20µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip increasing value                               1.01     51.0±0.21µs        ? ?/sec    1.00     50.3±0.27µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip single value                                   1.02     46.5±0.33µs        ? ?/sec    1.00     45.6±0.08µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip stepped increasing value                       1.00     73.8±0.14µs        ? ?/sec    1.00     73.5±0.12µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.01     89.0±0.28µs        ? ?/sec    1.00     88.1±0.19µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, half NULLs                          1.01     90.0±0.22µs        ? ?/sec    1.00     89.5±0.14µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, no NULLs                            1.01     91.1±0.36µs        ? ?/sec    1.00     90.0±0.15µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed stepped increasing value                            1.00    106.3±0.20µs        ? ?/sec    1.00    105.8±0.15µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, mandatory, no NULLs                                1.01    125.8±0.64µs        ? ?/sec    1.00    124.8±0.46µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, half NULLs                               1.00    148.1±0.29µs        ? ?/sec    1.00    147.6±0.18µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, no NULLs                                 1.01    129.4±0.47µs        ? ?/sec    1.00    128.3±0.19µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.00     54.0±0.06µs        ? ?/sec    1.02     55.3±0.24µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.00    110.9±0.13µs        ? ?/sec    1.00    110.5±0.10µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.01     58.0±0.05µs        ? ?/sec    1.00     57.4±0.05µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.01     84.9±0.09µs        ? ?/sec    1.00     84.0±0.05µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, half NULLs                          1.01    129.4±0.14µs        ? ?/sec    1.00    128.5±0.17µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, no NULLs                            1.02     88.9±0.06µs        ? ?/sec    1.00     87.5±0.07µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, mandatory, no NULLs                                1.00     47.0±0.09µs        ? ?/sec    1.00     46.9±0.06µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, half NULLs                               1.00    107.8±0.14µs        ? ?/sec    1.00    108.2±0.10µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, no NULLs                                 1.00     50.6±0.05µs        ? ?/sec    1.00     50.7±0.12µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed increasing value                                    1.00     77.3±0.16µs        ? ?/sec    1.00     77.4±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed single value                                        1.00     74.3±0.17µs        ? ?/sec    1.00     74.4±0.18µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip increasing value                               1.00     43.3±0.11µs        ? ?/sec    1.00     43.1±0.11µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip single value                                   1.00     41.6±0.11µs        ? ?/sec    1.00     41.6±0.10µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip stepped increasing value                       1.00     67.2±0.08µs        ? ?/sec    1.00     67.1±0.06µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.00     79.2±0.09µs        ? ?/sec    1.00     79.3±0.12µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, half NULLs                          1.00     90.2±0.08µs        ? ?/sec    1.00     89.9±0.10µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, no NULLs                            1.00     81.3±0.10µs        ? ?/sec    1.00     81.6±0.08µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed stepped increasing value                            1.00     99.1±0.12µs        ? ?/sec    1.00     99.1±0.10µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, mandatory, no NULLs                                1.00    114.7±0.15µs        ? ?/sec    1.00    114.9±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, half NULLs                               1.00    152.1±0.13µs        ? ?/sec    1.00    151.5±0.10µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, no NULLs                                 1.00    118.6±0.19µs        ? ?/sec    1.00    118.8±0.26µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.00     82.9±0.10µs        ? ?/sec    1.00     83.1±0.45µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.00    135.8±0.12µs        ? ?/sec    1.00    135.5±0.08µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.00     87.3±0.08µs        ? ?/sec    1.00     87.7±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.01     87.3±0.10µs        ? ?/sec    1.00     86.6±0.09µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, half NULLs                          1.01    140.1±0.13µs        ? ?/sec    1.00    138.9±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, no NULLs                            1.01     91.4±0.07µs        ? ?/sec    1.00     90.4±0.09µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, mandatory, no NULLs                                1.00     54.3±0.06µs        ? ?/sec    1.00     54.1±0.06µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, half NULLs                               1.00    121.3±0.28µs        ? ?/sec    1.00    121.0±0.16µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, no NULLs                                 1.00     58.3±0.21µs        ? ?/sec    1.00     58.2±0.21µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed increasing value                                               1.01     54.3±0.46µs        ? ?/sec    1.00     53.6±0.38µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed single value                                                   1.01     45.6±0.49µs        ? ?/sec    1.00     45.2±0.21µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip increasing value                                          1.01     33.8±0.22µs        ? ?/sec    1.00     33.4±0.24µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip single value                                              1.01     28.9±0.31µs        ? ?/sec    1.00     28.5±0.17µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip stepped increasing value                                  1.00     56.5±0.21µs        ? ?/sec    1.00     56.3±0.10µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, mandatory, no NULLs                                      1.01     72.2±0.31µs        ? ?/sec    1.00     71.4±0.14µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, half NULLs                                     1.00     73.1±0.15µs        ? ?/sec    1.00     72.9±0.13µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, no NULLs                                       1.00     74.0±0.34µs        ? ?/sec    1.00     73.7±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed stepped increasing value                                       1.01     73.0±0.17µs        ? ?/sec    1.00     72.6±0.17µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, mandatory, no NULLs                                           1.01     92.0±0.56µs        ? ?/sec    1.00     91.4±0.22µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, half NULLs                                          1.00    114.3±0.23µs        ? ?/sec    1.00    114.5±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, no NULLs                                            1.01     96.0±0.52µs        ? ?/sec    1.00     95.1±0.22µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     21.1±0.03µs        ? ?/sec    1.00     21.1±0.03µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, half NULLs                              1.00     77.3±0.14µs        ? ?/sec    1.00     77.3±0.08µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, no NULLs                                1.00     24.7±0.03µs        ? ?/sec    1.00     24.8±0.09µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, mandatory, no NULLs                                      1.01     51.7±0.04µs        ? ?/sec    1.00     51.2±0.03µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, half NULLs                                     1.00     95.9±0.12µs        ? ?/sec    1.00     95.7±0.09µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, no NULLs                                       1.01     55.7±0.07µs        ? ?/sec    1.00     54.9±0.06µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, mandatory, no NULLs                                           1.00     13.8±0.03µs        ? ?/sec    1.00     13.8±0.05µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, half NULLs                                          1.00     74.7±0.05µs        ? ?/sec    1.01     75.0±0.11µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, no NULLs                                            1.01     18.0±0.03µs        ? ?/sec    1.00     17.8±0.06µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed increasing value                                               1.01     50.8±0.47µs        ? ?/sec    1.00     50.5±0.35µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed single value                                                   1.02     42.3±0.61µs        ? ?/sec    1.00     41.5±0.26µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip increasing value                                          1.00     31.8±0.27µs        ? ?/sec    1.00     31.7±0.14µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip single value                                              1.03     27.3±0.36µs        ? ?/sec    1.00     26.5±0.10µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip stepped increasing value                                  1.00     54.7±0.12µs        ? ?/sec    1.00     54.6±0.10µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, mandatory, no NULLs                                      1.01     70.2±0.46µs        ? ?/sec    1.00     69.2±0.15µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, half NULLs                                     1.00     72.0±0.23µs        ? ?/sec    1.00     71.8±0.50µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, no NULLs                                       1.01     72.6±0.48µs        ? ?/sec    1.00     71.6±0.14µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed stepped increasing value                                       1.00     69.4±0.15µs        ? ?/sec    1.00     69.4±0.15µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, mandatory, no NULLs                                           1.02     88.8±0.75µs        ? ?/sec    1.00     87.4±0.26µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, half NULLs                                          1.00    111.5±0.36µs        ? ?/sec    1.00    111.5±0.20µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, no NULLs                                            1.02     92.9±0.72µs        ? ?/sec    1.00     91.4±0.25µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     17.4±0.01µs        ? ?/sec    1.00     17.3±0.02µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, half NULLs                              1.00     75.0±0.08µs        ? ?/sec    1.00     75.1±0.14µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, no NULLs                                1.00     21.0±0.02µs        ? ?/sec    1.00     21.0±0.06µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, mandatory, no NULLs                                      1.01     48.0±0.03µs        ? ?/sec    1.00     47.5±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, half NULLs                                     1.01     93.0±0.11µs        ? ?/sec    1.00     92.3±0.10µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, no NULLs                                       1.01     52.2±0.05µs        ? ?/sec    1.00     51.4±0.05µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, mandatory, no NULLs                                           1.00      9.8±0.01µs        ? ?/sec    1.01     10.0±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, half NULLs                                          1.00     71.7±0.07µs        ? ?/sec    1.01     72.3±0.07µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, no NULLs                                            1.00     13.7±0.03µs        ? ?/sec    1.01     13.8±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed increasing value                                               1.01     40.9±0.08µs        ? ?/sec    1.00     40.3±0.14µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed single value                                                   1.01     37.8±0.09µs        ? ?/sec    1.00     37.6±0.16µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip increasing value                                          1.02     24.6±0.06µs        ? ?/sec    1.00     24.2±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip single value                                              1.02     23.1±0.04µs        ? ?/sec    1.00     22.7±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip stepped increasing value                                  1.00     48.0±0.06µs        ? ?/sec    1.00     48.0±0.07µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, mandatory, no NULLs                                      1.00     60.5±0.07µs        ? ?/sec    1.00     60.5±0.07µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, half NULLs                                     1.00     71.0±0.07µs        ? ?/sec    1.00     71.3±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, no NULLs                                       1.00     62.6±0.06µs        ? ?/sec    1.00     62.7±0.08µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed stepped increasing value                                       1.00     62.2±0.09µs        ? ?/sec    1.00     62.1±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, mandatory, no NULLs                                           1.00     77.5±0.12µs        ? ?/sec    1.00     77.7±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, half NULLs                                          1.00    114.9±0.09µs        ? ?/sec    1.00    114.9±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, no NULLs                                            1.00     82.1±0.16µs        ? ?/sec    1.00     81.9±0.14µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     45.7±0.05µs        ? ?/sec    1.00     45.7±0.06µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, half NULLs                              1.00     99.1±0.09µs        ? ?/sec    1.00     98.7±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, no NULLs                                1.01     49.8±0.05µs        ? ?/sec    1.00     49.4±0.07µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, mandatory, no NULLs                                      1.01     50.1±0.03µs        ? ?/sec    1.00     49.4±0.08µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, half NULLs                                     1.01    102.4±0.08µs        ? ?/sec    1.00    101.7±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, no NULLs                                       1.02     54.5±0.11µs        ? ?/sec    1.00     53.5±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, mandatory, no NULLs                                           1.00     16.1±0.02µs        ? ?/sec    1.01     16.2±0.04µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, half NULLs                                          1.00     84.2±0.07µs        ? ?/sec    1.00     84.3±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, no NULLs                                            1.00     20.1±0.03µs        ? ?/sec    1.00     20.1±0.06µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed increasing value                                                1.03     53.7±0.63µs        ? ?/sec    1.00     51.9±0.45µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed single value                                                    1.04     45.2±0.67µs        ? ?/sec    1.00     43.5±0.62µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip increasing value                                           1.03     33.4±0.34µs        ? ?/sec    1.00     32.5±0.28µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip single value                                               1.04     28.9±0.36µs        ? ?/sec    1.00     27.8±0.35µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip stepped increasing value                                   1.01     56.4±0.12µs        ? ?/sec    1.00     56.1±0.09µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, mandatory, no NULLs                                       1.01     71.7±0.22µs        ? ?/sec    1.00     71.2±0.13µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, half NULLs                                      1.00     72.6±0.13µs        ? ?/sec    1.00     72.7±0.11µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, no NULLs                                        1.00     73.9±0.20µs        ? ?/sec    1.00     73.7±0.14µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed stepped increasing value                                        1.00     72.6±0.18µs        ? ?/sec    1.00     72.5±0.15µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, mandatory, no NULLs                                            1.00     91.7±0.29µs        ? ?/sec    1.00     91.6±0.23µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, half NULLs                                           1.00    113.6±0.16µs        ? ?/sec    1.00    113.3±0.17µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, no NULLs                                             1.00     95.8±0.26µs        ? ?/sec    1.00     95.8±0.21µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, mandatory, no NULLs                                1.00     20.8±0.07µs        ? ?/sec    1.00     20.8±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, half NULLs                               1.00     76.8±0.08µs        ? ?/sec    1.00     76.9±0.10µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, no NULLs                                 1.00     24.5±0.04µs        ? ?/sec    1.01     24.7±0.10µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, mandatory, no NULLs                                       1.01     51.2±0.04µs        ? ?/sec    1.00     50.9±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, half NULLs                                      1.00     95.6±0.27µs        ? ?/sec    1.00     95.4±0.11µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, no NULLs                                        1.01     55.4±0.04µs        ? ?/sec    1.00     54.8±0.05µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, mandatory, no NULLs                                            1.00     13.6±0.04µs        ? ?/sec    1.01     13.7±0.05µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, half NULLs                                           1.00     74.0±0.10µs        ? ?/sec    1.02     75.3±0.08µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, no NULLs                                             1.00     17.6±0.02µs        ? ?/sec    1.01     17.7±0.05µs        ? ?/sec
arrow_array_reader/ListArray/plain encoded optional strings half NULLs                                     1.00      3.9±0.01ms        ? ?/sec    1.00      3.9±0.01ms        ? ?/sec
arrow_array_reader/ListArray/plain encoded optional strings no NULLs                                       1.00      7.1±0.05ms        ? ?/sec    1.01      7.2±0.22ms        ? ?/sec
arrow_array_reader/StringArray/const delta byte array encoded, mandatory, no NULLs                         1.00    530.4±3.20µs        ? ?/sec    1.02    541.5±1.98µs        ? ?/sec
arrow_array_reader/StringArray/const delta length byte array encoded, mandatory, no NULLs                  1.00    215.4±0.94µs        ? ?/sec    1.01    217.1±0.81µs        ? ?/sec
arrow_array_reader/StringArray/const prefix delta byte array encoded, mandatory, no NULLs                  1.00   759.7±35.40µs        ? ?/sec    1.02   777.7±37.20µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, mandatory, no NULLs                                     1.00    278.0±0.68µs        ? ?/sec    1.00    276.9±0.16µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, half NULLs                                    1.00    384.0±0.52µs        ? ?/sec    1.00    383.6±0.69µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, no NULLs                                      1.00    282.3±0.63µs        ? ?/sec    1.00    281.0±0.18µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, mandatory, no NULLs                                          1.00    456.1±4.07µs        ? ?/sec    1.00    455.1±5.68µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, half NULLs                                         1.00    487.6±3.71µs        ? ?/sec    1.00    489.0±2.85µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, no NULLs                                           1.00    462.4±7.20µs        ? ?/sec    1.00    461.2±6.26µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, mandatory, no NULLs                                1.00    257.3±0.91µs        ? ?/sec    1.00    256.3±0.90µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, half NULLs                               1.00    279.1±1.14µs        ? ?/sec    1.01    281.0±1.25µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, no NULLs                                 1.00    261.6±0.86µs        ? ?/sec    1.00    260.7±0.77µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, mandatory, no NULLs                                 1.01     80.4±0.04µs        ? ?/sec    1.00     79.9±0.07µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, half NULLs                                1.03    111.3±0.13µs        ? ?/sec    1.00    107.6±0.15µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, no NULLs                                  1.00     84.1±0.09µs        ? ?/sec    1.00     83.7±0.06µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, mandatory, no NULLs                                      1.00    219.8±0.30µs        ? ?/sec    1.00    219.0±0.36µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, half NULLs                                     1.03    185.7±0.38µs        ? ?/sec    1.00    180.7±2.33µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, no NULLs                                       1.01    228.7±0.31µs        ? ?/sec    1.00    226.8±0.42µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed increasing value                                              1.03     54.2±0.45µs        ? ?/sec    1.00     52.5±0.48µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed single value                                                  1.03     45.4±0.51µs        ? ?/sec    1.00     44.1±0.34µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip increasing value                                         1.03     33.8±0.26µs        ? ?/sec    1.00     32.8±0.31µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip single value                                             1.03     28.9±0.29µs        ? ?/sec    1.00     28.0±0.26µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip stepped increasing value                                 1.00     56.4±0.13µs        ? ?/sec    1.00     56.2±0.10µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, mandatory, no NULLs                                     1.00     75.4±0.07µs        ? ?/sec    1.00     75.6±0.12µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, half NULLs                                    1.00     75.4±0.10µs        ? ?/sec    1.00     75.6±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, no NULLs                                      1.00     77.4±0.10µs        ? ?/sec    1.01     78.0±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed stepped increasing value                                      1.00     72.7±0.18µs        ? ?/sec    1.00     72.6±0.19µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, mandatory, no NULLs                                          1.00     96.6±0.11µs        ? ?/sec    1.01     97.3±0.19µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, half NULLs                                         1.00    117.3±0.14µs        ? ?/sec    1.00    117.4±0.19µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, no NULLs                                           1.00    100.4±0.11µs        ? ?/sec    1.01    101.5±0.17µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     21.0±0.03µs        ? ?/sec    1.00     21.0±0.03µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, half NULLs                             1.00     77.6±0.08µs        ? ?/sec    1.00     77.5±0.09µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, no NULLs                               1.00     24.6±0.02µs        ? ?/sec    1.01     24.8±0.05µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, mandatory, no NULLs                                     1.01     51.6±0.03µs        ? ?/sec    1.00     51.3±0.04µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, half NULLs                                    1.00     95.6±0.14µs        ? ?/sec    1.00     95.4±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, no NULLs                                      1.01     55.6±0.05µs        ? ?/sec    1.00     55.0±0.08µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, mandatory, no NULLs                                          1.00     13.9±0.01µs        ? ?/sec    1.01     14.1±0.06µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, half NULLs                                         1.00     74.6±0.07µs        ? ?/sec    1.00     74.9±0.13µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, no NULLs                                           1.00     17.7±0.03µs        ? ?/sec    1.00     17.7±0.04µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed increasing value                                              1.04     51.0±0.37µs        ? ?/sec    1.00     48.8±0.42µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed single value                                                  1.04     42.5±0.51µs        ? ?/sec    1.00     40.7±0.54µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip increasing value                                         1.04     32.0±0.22µs        ? ?/sec    1.00     30.8±0.24µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip single value                                             1.03     27.1±0.31µs        ? ?/sec    1.00     26.3±0.35µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip stepped increasing value                                 1.00     54.8±0.12µs        ? ?/sec    1.00     54.6±0.11µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, mandatory, no NULLs                                     1.02     70.4±0.41µs        ? ?/sec    1.00     69.3±0.20µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, half NULLs                                    1.00     71.3±0.21µs        ? ?/sec    1.00     71.0±0.15µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, no NULLs                                      1.02     72.5±0.42µs        ? ?/sec    1.00     71.3±0.20µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed stepped increasing value                                      1.00     69.6±0.16µs        ? ?/sec    1.00     69.4±0.16µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, mandatory, no NULLs                                          1.01     88.8±0.64µs        ? ?/sec    1.00     87.6±0.37µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, half NULLs                                         1.00    111.4±0.29µs        ? ?/sec    1.00    111.3±0.22µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, no NULLs                                           1.01     92.7±0.66µs        ? ?/sec    1.00     91.4±0.34µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     17.5±0.02µs        ? ?/sec    1.00     17.5±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, half NULLs                             1.00     74.5±0.15µs        ? ?/sec    1.02     75.7±0.13µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, no NULLs                               1.00     20.8±0.03µs        ? ?/sec    1.02     21.1±0.04µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, mandatory, no NULLs                                     1.02     48.5±0.03µs        ? ?/sec    1.00     47.8±0.03µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, half NULLs                                    1.00     92.0±0.10µs        ? ?/sec    1.00     92.0±0.09µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, no NULLs                                      1.01     52.2±0.06µs        ? ?/sec    1.00     51.4±0.03µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, mandatory, no NULLs                                          1.00     10.1±0.01µs        ? ?/sec    1.00     10.1±0.04µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, half NULLs                                         1.00     71.4±0.10µs        ? ?/sec    1.01     72.1±0.07µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, no NULLs                                           1.01     13.9±0.01µs        ? ?/sec    1.00     13.8±0.04µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed increasing value                                              1.01     41.3±0.11µs        ? ?/sec    1.00     40.9±0.16µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed single value                                                  1.01     38.1±0.11µs        ? ?/sec    1.00     37.9±0.15µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip increasing value                                         1.01     24.7±0.07µs        ? ?/sec    1.00     24.5±0.10µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip single value                                             1.01     23.2±0.06µs        ? ?/sec    1.00     23.0±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip stepped increasing value                                 1.00     48.1±0.04µs        ? ?/sec    1.00     48.2±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, mandatory, no NULLs                                     1.00     60.5±0.08µs        ? ?/sec    1.00     60.6±0.09µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, half NULLs                                    1.00     71.3±0.12µs        ? ?/sec    1.00     71.5±0.05µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, no NULLs                                      1.00     62.7±0.08µs        ? ?/sec    1.00     62.6±0.08µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed stepped increasing value                                      1.00     62.0±0.09µs        ? ?/sec    1.01     62.4±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, mandatory, no NULLs                                          1.00     77.9±0.14µs        ? ?/sec    1.00     78.0±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, half NULLs                                         1.00    115.0±0.11µs        ? ?/sec    1.00    115.1±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, no NULLs                                           1.00     82.1±0.13µs        ? ?/sec    1.00     82.1±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     45.8±0.03µs        ? ?/sec    1.01     46.3±0.05µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, half NULLs                             1.00     98.7±0.09µs        ? ?/sec    1.00     98.8±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, no NULLs                               1.00     50.1±0.06µs        ? ?/sec    1.01     50.6±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, mandatory, no NULLs                                     1.01     50.2±0.04µs        ? ?/sec    1.00     49.7±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, half NULLs                                    1.01    102.7±0.09µs        ? ?/sec    1.00    102.0±0.10µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, no NULLs                                      1.02     54.6±0.03µs        ? ?/sec    1.00     53.5±0.15µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, mandatory, no NULLs                                          1.00     16.3±0.02µs        ? ?/sec    1.01     16.5±0.07µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, half NULLs                                         1.00     84.4±0.10µs        ? ?/sec    1.00     84.2±0.07µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, no NULLs                                           1.01     20.3±0.05µs        ? ?/sec    1.00     20.1±0.06µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed increasing value                                               1.01     54.1±0.45µs        ? ?/sec    1.00     53.6±0.38µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed single value                                                   1.02     45.7±0.61µs        ? ?/sec    1.00     44.8±0.23µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip increasing value                                          1.01     33.8±0.19µs        ? ?/sec    1.00     33.5±0.17µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip single value                                              1.03     29.1±0.34µs        ? ?/sec    1.00     28.1±0.08µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip stepped increasing value                                  1.00     56.5±0.08µs        ? ?/sec    1.00     56.4±0.11µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, mandatory, no NULLs                                      1.00     75.3±0.22µs        ? ?/sec    1.00     75.2±0.09µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, half NULLs                                     1.00     74.3±0.11µs        ? ?/sec    1.01     74.7±0.09µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, no NULLs                                       1.00     77.1±0.08µs        ? ?/sec    1.01     77.9±0.15µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed stepped increasing value                                       1.00     72.6±0.16µs        ? ?/sec    1.00     72.8±0.17µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, mandatory, no NULLs                                           1.00     95.9±0.13µs        ? ?/sec    1.00     96.3±0.09µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, half NULLs                                          1.00    116.0±0.30µs        ? ?/sec    1.01    116.7±0.16µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, no NULLs                                            1.00     99.9±0.14µs        ? ?/sec    1.00    100.1±0.13µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     20.8±0.02µs        ? ?/sec    1.00     20.8±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, half NULLs                              1.01     77.9±0.14µs        ? ?/sec    1.00     77.0±0.13µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, no NULLs                                1.00     24.5±0.05µs        ? ?/sec    1.01     24.7±0.05µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, mandatory, no NULLs                                      1.02     51.8±0.03µs        ? ?/sec    1.00     50.8±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, half NULLs                                     1.00     95.5±0.19µs        ? ?/sec    1.00     95.7±0.14µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, no NULLs                                       1.02     55.6±0.05µs        ? ?/sec    1.00     54.5±0.07µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, mandatory, no NULLs                                           1.00     13.7±0.03µs        ? ?/sec    1.00     13.7±0.06µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, half NULLs                                          1.00     74.7±0.08µs        ? ?/sec    1.00     74.7±0.10µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, no NULLs                                            1.00     17.4±0.02µs        ? ?/sec    1.01     17.5±0.05µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, half NULLs            1.00     72.2±0.12µs        ? ?/sec    1.00     72.5±0.08µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, no NULLs              1.02     14.0±0.01µs        ? ?/sec    1.00     13.7±0.03µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, half NULLs             1.00    132.7±0.17µs        ? ?/sec    1.00    133.1±0.13µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, no NULLs               1.00     65.5±0.34µs        ? ?/sec    1.00     65.4±0.05µs        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 2805.6s
Peak memory 4.3 GiB
Avg memory 4.2 GiB
CPU user 2801.7s
CPU sys 1.2s
Peak spill 0 B

branch

Metric Value
Wall time 2800.6s
Peak memory 4.3 GiB
Avg memory 4.2 GiB
CPU user 2795.8s
CPU sys 0.4s
Peak spill 0 B

File an issue against this benchmark runner

@HippoBaro HippoBaro force-pushed the frontier_row_group_selection branch from 307e4d8 to 72d5c60 Compare April 26, 2026 02:25
Extract the push decoder offset/limit accounting into `RowBudget` and
use it when planning row-group reads.

This centralizes the row-count arithmetic needed to apply offset and
limit without changing decoder behavior. It also adds focused tests for
plain limit, offset+limit, and empty-selection cases so later frontier
work can reuse the same accounting safely.

Signed-off-by: Hippolyte Barraud <hippolyte.barraud@datadoghq.com>
Move the cross-row-group scan state into a dedicated `RowGroupFrontier`.

The frontier now owns the queued row groups, the tail `RowSelection`,
the running `RowBudget`, and the conservative "has predicates" flag.
Reduce `RowGroupReaderBuilder` to current-row-group work only by
threading a budget snapshot into `next_row_group` and returning a typed
`RowGroupBuildResult`.

This also folds in the selection-frontier cleanup so queued selection
state is consumed in one place instead of through ad hoc split/clone
logic.

Signed-off-by: Hippolyte Barraud <hippolyte.barraud@datadoghq.com>
@HippoBaro HippoBaro force-pushed the frontier_row_group_selection branch from 72d5c60 to 52cb122 Compare April 26, 2026 03:12
@HippoBaro
Copy link
Copy Markdown
Contributor Author

HippoBaro commented Apr 26, 2026

@alamb Thank you for the thorough review. I've updated the code as suggested. State is no longer duplicated, the state machines are simpler, and I also removed SelectionFrontier. It's now folded into RowGroupFrontier.

I also rebased to play nicely with changes made in #9766, which impacted the new RowBudget.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

parquet Changes to the parquet crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants