Skip to content

Push LIMIT / OFFSET into the last RowFilter predicate and skip unused row groups#9766

Merged
alamb merged 12 commits into
apache:mainfrom
haohuaijin:fix-pushdown-limit-early-stop
Apr 24, 2026
Merged

Push LIMIT / OFFSET into the last RowFilter predicate and skip unused row groups#9766
alamb merged 12 commits into
apache:mainfrom
haohuaijin:fix-pushdown-limit-early-stop

Conversation

@haohuaijin

@haohuaijin haohuaijin commented Apr 19, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

What changes are included in this PR?

Push LIMIT + OFFSET into the last RowFilter predicate and skip row groups once the limit is exhausted.

  1. Within a row group. New ReadPlanBuilder::with_predicate_limited takes an optional cap; once cumulative matches reach it, the batch filter is truncated and the reader loop breaks. The tail is padded as "not selected" so RowSelection still spans the full row group. with_predicate becomes a thin wrapper passing None.

  2. Across row groups. RowGroupReaderBuilder::transition short-circuits Start → Finished when limit == Some(0), skipping filter-plan setup and predicate-column fetches.

  3. Wiring. FilterInfo::is_last marks the final predicate; the call site passes Some(limit + offset) only for it (offset is included because with_offset runs after the predicate).

Are these changes tested?

  • Unit tests for truncate_filter_after_n_trues and tail-padding in with_predicate_limited.
  • End-to-end decoder tests covering: short-circuit within a row group, later row groups not fetched, correct offset + limit window, multi-predicate chains short-circuiting only on the last predicate, and preservation with a prior RowSelection. Predicate-invocation counters verify fewer rows are evaluated.
  • New benchmark_filters_with_limit group in arrow_reader_row_filter.rs with LIMIT 10.

Are there any user-facing changes?

  • New public ReadPlanBuilder::with_predicate_limited; with_predicate unchanged. No breaking changes.
  • RowFilter + with_limit/with_offset reads now decode fewer predicate pages. Output is identical.

@github-actions github-actions Bot added the parquet Changes to the parquet crate label Apr 19, 2026
Comment thread parquet/benches/arrow_reader_row_filter.rs
@haohuaijin haohuaijin changed the title perf: add limit to last predicate Push LIMIT / OFFSET into the last RowFilter predicate and skip unused row groups Apr 19, 2026
Comment thread parquet/benches/arrow_reader_row_filter.rs
@haohuaijin

haohuaijin commented Apr 19, 2026

Copy link
Copy Markdown
Contributor Author

benchmark result
image

for this benchmark in main branch, i copy the benchmark file to main branch. the benchmark script is below

git checkout main
cargo bench --bench arrow_reader_row_filter --features="arrow async" -- arrow_reader_row_filter_limit --save-baseline main
git checkout fix-pushdown-limit-early-stop
cargo bench --bench arrow_reader_row_filter --features="arrow async" -- arrow_reader_row_filter_limit --save-baseline 9766
critcmp main 9766

@Dandandan

Copy link
Copy Markdown
Contributor

run benchmarks arrow_reader_row_filter_limit

@Dandandan

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_row_filter

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4275539973-1503-r9mkx 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 fix-pushdown-limit-early-stop (011e068) to 51b02f1 (merge-base) diff
BENCH_NAME=arrow_reader_row_filter
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_row_filter
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4275532723-1502-t5b65 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 fix-pushdown-limit-early-stop (011e068) to 51b02f1 (merge-base) diff
BENCH_NAME=arrow_reader_row_filter_limit
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_row_filter_limit
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

Benchmark for this request failed.

Last 20 lines of output:

Click to expand
    record_batch
    regexp_kernels
    row_format
    row_group_index_reader
    row_selection_cursor
    row_selector
    serde
    sort_kernel
    string_dictionary_builder
    string_run_builder
    string_run_iterator
    substring_kernels
    take_kernels
    union_array
    variant_builder
    variant_kernels
    variant_validation
    view_types
    writer_overhead
    zip_kernels

File an issue against this benchmark runner

@Dandandan

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_clickbench

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4275550349-1504-n7vkl 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 fix-pushdown-limit-early-stop (011e068) to 51b02f1 (merge-base) diff
BENCH_NAME=arrow_reader_clickbench
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_clickbench
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                                                                                              fix-pushdown-limit-early-stop          main
-----                                                                                              -----------------------------          ----
arrow_reader_row_filter/float64 <= 99.0/all_columns/async                                          5.16      5.3±0.02ms        ? ?/sec    1.00   1027.8±4.87µs        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/all_columns/sync                                           5.13      5.2±0.02ms        ? ?/sec    1.00   1010.4±4.67µs        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/async                                5.18      4.6±0.02ms        ? ?/sec    1.00    889.5±3.56µs        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/sync                                 5.07      4.5±0.02ms        ? ?/sec    1.00    885.7±3.46µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/async                            5.27      4.2±0.01ms        ? ?/sec    1.00    789.9±1.59µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/sync                             5.20      4.5±0.02ms        ? ?/sec    1.00    861.3±2.35µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/async                  5.26      3.7±0.01ms        ? ?/sec    1.00    703.0±2.01µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/sync                   5.19      3.7±0.01ms        ? ?/sec    1.00    708.8±2.44µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/async                                           5.17      5.3±0.02ms        ? ?/sec    1.00   1028.5±5.75µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/sync                                            5.14      5.2±0.02ms        ? ?/sec    1.00   1013.1±3.99µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/async                                 5.18      4.6±0.02ms        ? ?/sec    1.00    890.0±4.02µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/sync                                  5.07      4.5±0.02ms        ? ?/sec    1.00    888.2±3.53µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/async                                            1.96    886.1±1.77µs        ? ?/sec    1.00    452.6±1.32µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/sync                                             5.12      2.2±0.01ms        ? ?/sec    1.00    425.1±1.18µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/async                                  1.95    806.2±1.81µs        ? ?/sec    1.00    412.5±2.82µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/sync                                   5.15      2.2±0.01ms        ? ?/sec    1.00    418.1±1.31µs        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/async                                               5.10      7.6±0.02ms        ? ?/sec    1.00   1486.6±5.22µs        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/sync                                                5.12      6.7±0.02ms        ? ?/sec    1.00   1308.8±4.77µs        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/async                                     5.08      7.1±0.02ms        ? ?/sec    1.00   1392.4±5.59µs        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/sync                                      5.13      6.2±0.02ms        ? ?/sec    1.00   1210.4±3.15µs        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/async                                                5.23      5.0±0.02ms        ? ?/sec    1.00    956.5±3.70µs        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/sync                                                 5.16      5.4±0.02ms        ? ?/sec    1.00   1037.7±3.15µs        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/async                                      5.23      4.6±0.02ms        ? ?/sec    1.00    878.2±3.77µs        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/sync                                       5.18      4.6±0.02ms        ? ?/sec    1.00    885.2±2.77µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/async                                               5.40      3.5±0.01ms        ? ?/sec    1.00    645.4±1.56µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/sync                                                5.21      3.6±0.02ms        ? ?/sec    1.00    696.6±1.97µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/async                                     5.33      3.2±0.01ms        ? ?/sec    1.00    592.6±1.94µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/sync                                      5.24      3.2±0.01ms        ? ?/sec    1.00    602.1±1.94µs        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/async                                           5.06      8.5±0.03ms        ? ?/sec    1.00   1686.2±6.25µs        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/sync                                            5.12      9.3±0.03ms        ? ?/sec    1.00   1809.4±5.98µs        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/async                                 5.09      7.1±0.03ms        ? ?/sec    1.00   1401.3±5.32µs        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/sync                                  5.02      6.3±0.03ms        ? ?/sec    1.00   1251.0±5.30µs        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/all_columns/limit10/async                            1.00    339.1±1.36µs        ? ?/sec  
arrow_reader_row_filter_limit/float64 <= 99.0/exclude_filter_column/limit10/async                  1.00    333.5±1.34µs        ? ?/sec  
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/all_columns/limit10/async              1.00    377.8±1.37µs        ? ?/sec  
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/exclude_filter_column/limit10/async    1.00    361.3±1.40µs        ? ?/sec  
arrow_reader_row_filter_limit/float64 > 99.0/all_columns/limit10/async                             1.00    340.1±1.38µs        ? ?/sec  
arrow_reader_row_filter_limit/float64 > 99.0/exclude_filter_column/limit10/async                   1.00    333.8±1.28µs        ? ?/sec  
arrow_reader_row_filter_limit/int64 > 90/all_columns/limit10/async                                 1.00    334.8±1.34µs        ? ?/sec  
arrow_reader_row_filter_limit/int64 > 90/exclude_filter_column/limit10/async                       1.00    328.3±0.99µs        ? ?/sec  
arrow_reader_row_filter_limit/ts < 9000/all_columns/limit10/async                                  1.00    332.1±1.69µs        ? ?/sec  
arrow_reader_row_filter_limit/ts < 9000/exclude_filter_column/limit10/async                        1.00    326.5±1.23µs        ? ?/sec  
arrow_reader_row_filter_limit/ts >= 9000/all_columns/limit10/async                                 1.00    347.7±1.07µs        ? ?/sec  
arrow_reader_row_filter_limit/ts >= 9000/exclude_filter_column/limit10/async                       1.00    339.6±1.15µs        ? ?/sec  
arrow_reader_row_filter_limit/utf8View <> ''/all_columns/limit10/async                             1.00    356.7±1.44µs        ? ?/sec  
arrow_reader_row_filter_limit/utf8View <> ''/exclude_filter_column/limit10/async                   1.00    346.6±1.17µs        ? ?/sec  

Resource Usage

base (merge-base)

Metric Value
Wall time 375.5s
Peak memory 2.4 GiB
Avg memory 2.3 GiB
CPU user 374.5s
CPU sys 0.8s
Peak spill 0 B

branch

Metric Value
Wall time 470.8s
Peak memory 2.3 GiB
Avg memory 2.3 GiB
CPU user 470.5s
CPU sys 0.3s
Peak spill 0 B

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                                             fix-pushdown-limit-early-stop          main
-----                                             -----------------------------          ----
arrow_reader_clickbench/async/Q1                  1.02   1090.0±4.55µs        ? ?/sec    1.00   1066.9±7.46µs        ? ?/sec
arrow_reader_clickbench/async/Q10                 1.00      6.7±0.24ms        ? ?/sec    1.01      6.7±0.25ms        ? ?/sec
arrow_reader_clickbench/async/Q11                 1.00      7.7±0.27ms        ? ?/sec    1.00      7.7±0.26ms        ? ?/sec
arrow_reader_clickbench/async/Q12                 1.00     14.2±0.27ms        ? ?/sec    1.03     14.6±0.33ms        ? ?/sec
arrow_reader_clickbench/async/Q13                 1.00     16.9±0.34ms        ? ?/sec    1.03     17.5±0.32ms        ? ?/sec
arrow_reader_clickbench/async/Q14                 1.00     15.7±0.32ms        ? ?/sec    1.03     16.2±0.33ms        ? ?/sec
arrow_reader_clickbench/async/Q19                 1.01      3.1±0.07ms        ? ?/sec    1.00      3.0±0.08ms        ? ?/sec
arrow_reader_clickbench/async/Q20                 1.09     80.1±2.09ms        ? ?/sec    1.00     73.4±0.57ms        ? ?/sec
arrow_reader_clickbench/async/Q21                 1.12     91.4±3.54ms        ? ?/sec    1.00     81.8±0.77ms        ? ?/sec
arrow_reader_clickbench/async/Q22                 1.08    125.2±4.51ms        ? ?/sec    1.00    115.5±2.17ms        ? ?/sec
arrow_reader_clickbench/async/Q23                 1.00    238.2±2.51ms        ? ?/sec    1.04    248.2±2.59ms        ? ?/sec
arrow_reader_clickbench/async/Q24                 1.00     19.0±0.41ms        ? ?/sec    1.03     19.5±0.46ms        ? ?/sec
arrow_reader_clickbench/async/Q27                 1.00     56.3±0.52ms        ? ?/sec    1.03     58.2±0.64ms        ? ?/sec
arrow_reader_clickbench/async/Q28                 1.00     56.6±0.51ms        ? ?/sec    1.04     58.8±0.66ms        ? ?/sec
arrow_reader_clickbench/async/Q30                 1.00     18.1±0.15ms        ? ?/sec    1.02     18.5±0.22ms        ? ?/sec
arrow_reader_clickbench/async/Q36                 1.00     14.4±0.39ms        ? ?/sec    1.05     15.1±0.45ms        ? ?/sec
arrow_reader_clickbench/async/Q37                 1.00      5.3±0.07ms        ? ?/sec    1.02      5.4±0.07ms        ? ?/sec
arrow_reader_clickbench/async/Q38                 1.00     12.7±0.32ms        ? ?/sec    1.05     13.4±0.35ms        ? ?/sec
arrow_reader_clickbench/async/Q39                 1.00     22.8±0.34ms        ? ?/sec    1.06     24.1±0.54ms        ? ?/sec
arrow_reader_clickbench/async/Q40                 1.00      5.6±0.10ms        ? ?/sec    1.03      5.7±0.11ms        ? ?/sec
arrow_reader_clickbench/async/Q41                 1.00      4.8±0.06ms        ? ?/sec    1.03      4.9±0.08ms        ? ?/sec
arrow_reader_clickbench/async/Q42                 1.00      3.4±0.03ms        ? ?/sec    1.01      3.5±0.05ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q1     1.02   1062.0±7.26µs        ? ?/sec    1.00   1043.4±4.72µs        ? ?/sec
arrow_reader_clickbench/async_object_store/Q10    1.01      6.5±0.24ms        ? ?/sec    1.00      6.4±0.23ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q11    1.00      7.4±0.28ms        ? ?/sec    1.00      7.4±0.27ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q12    1.00     14.2±0.27ms        ? ?/sec    1.03     14.6±0.30ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q13    1.00     16.7±0.38ms        ? ?/sec    1.03     17.3±0.42ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q14    1.00     15.4±0.34ms        ? ?/sec    1.03     15.8±0.39ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q19    1.01      3.0±0.06ms        ? ?/sec    1.00      2.9±0.06ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q20    1.00     70.4±0.53ms        ? ?/sec    1.03     72.5±0.85ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q21    1.00     79.1±0.53ms        ? ?/sec    1.02     81.0±0.59ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q22    1.00     96.0±0.74ms        ? ?/sec    1.04     99.7±1.05ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q23    1.00    225.9±1.98ms        ? ?/sec    1.05    236.6±2.61ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q24    1.00     18.6±0.41ms        ? ?/sec    1.04     19.4±0.48ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q27    1.00     55.9±0.54ms        ? ?/sec    1.02     57.2±0.72ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q28    1.00     56.1±0.54ms        ? ?/sec    1.03     58.0±0.76ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q30    1.00     17.7±0.18ms        ? ?/sec    1.03     18.1±0.27ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q36    1.00     13.9±0.46ms        ? ?/sec    1.06     14.7±0.44ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q37    1.00      5.2±0.08ms        ? ?/sec    1.02      5.3±0.07ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q38    1.00     12.3±0.40ms        ? ?/sec    1.04     12.8±0.39ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q39    1.00     22.1±0.31ms        ? ?/sec    1.06     23.3±0.50ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q40    1.00      5.2±0.11ms        ? ?/sec    1.04      5.5±0.13ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q41    1.00      4.6±0.06ms        ? ?/sec    1.04      4.7±0.09ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q42    1.00      3.3±0.02ms        ? ?/sec    1.02      3.3±0.04ms        ? ?/sec
arrow_reader_clickbench/sync/Q1                   1.01    881.1±2.93µs        ? ?/sec    1.00    875.2±1.63µs        ? ?/sec
arrow_reader_clickbench/sync/Q10                  1.00      5.1±0.06ms        ? ?/sec    1.00      5.1±0.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q11                  1.01      6.1±0.07ms        ? ?/sec    1.00      6.0±0.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q12                  1.00     21.1±0.20ms        ? ?/sec    1.03     21.7±0.36ms        ? ?/sec
arrow_reader_clickbench/sync/Q13                  1.00     23.8±0.31ms        ? ?/sec    1.03     24.5±0.40ms        ? ?/sec
arrow_reader_clickbench/sync/Q14                  1.00     22.4±0.25ms        ? ?/sec    1.02     22.9±0.34ms        ? ?/sec
arrow_reader_clickbench/sync/Q19                  1.00      2.7±0.06ms        ? ?/sec    1.00      2.7±0.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q20                  1.00    117.5±0.74ms        ? ?/sec    1.06    124.2±1.04ms        ? ?/sec
arrow_reader_clickbench/sync/Q21                  1.00     91.0±0.53ms        ? ?/sec    1.08     98.5±0.91ms        ? ?/sec
arrow_reader_clickbench/sync/Q22                  1.00    137.6±1.17ms        ? ?/sec    1.05    145.0±1.96ms        ? ?/sec
arrow_reader_clickbench/sync/Q23                  1.00    284.6±7.46ms        ? ?/sec    1.01    286.5±3.99ms        ? ?/sec
arrow_reader_clickbench/sync/Q24                  1.00     26.0±0.40ms        ? ?/sec    1.02     26.5±0.49ms        ? ?/sec
arrow_reader_clickbench/sync/Q27                  1.00    104.7±0.63ms        ? ?/sec    1.03    108.2±0.90ms        ? ?/sec
arrow_reader_clickbench/sync/Q28                  1.00    101.7±0.65ms        ? ?/sec    1.04    106.3±1.03ms        ? ?/sec
arrow_reader_clickbench/sync/Q30                  1.00     18.2±0.20ms        ? ?/sec    1.02     18.5±0.25ms        ? ?/sec
arrow_reader_clickbench/sync/Q36                  1.00     21.8±0.27ms        ? ?/sec    1.01     22.1±0.34ms        ? ?/sec
arrow_reader_clickbench/sync/Q37                  1.00      6.6±0.06ms        ? ?/sec    1.01      6.7±0.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q38                  1.00     11.2±0.15ms        ? ?/sec    1.01     11.4±0.19ms        ? ?/sec
arrow_reader_clickbench/sync/Q39                  1.00     20.0±0.25ms        ? ?/sec    1.02     20.3±0.37ms        ? ?/sec
arrow_reader_clickbench/sync/Q40                  1.00      4.9±0.09ms        ? ?/sec    1.03      5.1±0.12ms        ? ?/sec
arrow_reader_clickbench/sync/Q41                  1.00      5.4±0.07ms        ? ?/sec    1.02      5.5±0.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q42                  1.00      4.2±0.05ms        ? ?/sec    1.00      4.2±0.06ms        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 785.9s
Peak memory 3.1 GiB
Avg memory 2.9 GiB
CPU user 708.8s
CPU sys 75.9s
Peak spill 0 B

branch

Metric Value
Wall time 776.2s
Peak memory 3.2 GiB
Avg memory 3.1 GiB
CPU user 712.1s
CPU sys 64.1s
Peak spill 0 B

File an issue against this benchmark runner

@haohuaijin

Copy link
Copy Markdown
Contributor Author

Hi @Dandandan thank you for trigger benchmark, i submit another pr to add the new benchmark for limit #9767 to make it easy to compare(after merge to main)

alamb pushed a commit that referenced this pull request Apr 19, 2026
# Which issue does this PR close?

<!--
We generally require a GitHub issue to be filed for all bug fixes and
enhancements and this helps us generate change logs for our releases.
You can link an issue to this PR using the GitHub syntax.
-->

- part of #9766 

# Rationale for this change

<!--
Why are you proposing this change? If this is already explained clearly
in the issue then this section is not needed.
Explaining clearly why changes are proposed helps reviewers understand
your changes and offer better suggestions for fixes.
-->

# What changes are included in this PR?

<!--
There is no need to duplicate the description in the issue here but it
is sometimes worth providing a summary of the individual changes in this
PR.
-->

# Are these changes tested?

<!--
We typically require tests for all PRs in order to:
1. Prevent the code from being accidentally broken by subsequent changes
2. Serve as another way to document the expected behavior of the code

If tests are not included in your PR, please explain why (for example,
are they covered by existing tests)?
-->

# Are there any user-facing changes?

<!--
If there are user-facing changes then we may require documentation to be
updated before approving the PR.

If there are any breaking changes to public APIs, please call them out.
-->
@alamb

alamb commented Apr 19, 2026

Copy link
Copy Markdown
Contributor

Hi @Dandandan thank you for trigger benchmark, i submit another pr to add the new benchmark for limit #9767 to make it easy to compare(after merge to main)

I just merged and updated this PR and will retrigger

@alamb

alamb commented Apr 19, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_clickbench

@alamb

alamb commented Apr 19, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_row_filter

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4276000145-1538-6xzz7 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 fix-pushdown-limit-early-stop (15e7f5f) to 9d3a4d9 (merge-base) diff
BENCH_NAME=arrow_reader_clickbench
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_clickbench
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4276000327-1539-92zch 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 fix-pushdown-limit-early-stop (15e7f5f) to 9d3a4d9 (merge-base) diff
BENCH_NAME=arrow_reader_row_filter
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_row_filter
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                                                                                              fix-pushdown-limit-early-stop          main
-----                                                                                              -----------------------------          ----
arrow_reader_row_filter/float64 <= 99.0/all_columns/async                                          1.00      5.3±0.02ms        ? ?/sec    1.02      5.4±0.01ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/all_columns/sync                                           1.00      5.2±0.02ms        ? ?/sec    1.01      5.3±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/async                                1.00      4.6±0.01ms        ? ?/sec    1.01      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/sync                                 1.00      4.5±0.02ms        ? ?/sec    1.01      4.5±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/async                            1.00      4.2±0.01ms        ? ?/sec    1.00      4.2±0.01ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/sync                             1.00      4.6±0.02ms        ? ?/sec    1.01      4.6±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/async                  1.00      3.7±0.02ms        ? ?/sec    1.01      3.8±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/sync                   1.00      3.7±0.01ms        ? ?/sec    1.00      3.7±0.01ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/async                                           1.00      5.3±0.02ms        ? ?/sec    1.01      5.4±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/sync                                            1.00      5.2±0.01ms        ? ?/sec    1.01      5.3±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/async                                 1.00      4.6±0.01ms        ? ?/sec    1.02      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/sync                                  1.00      4.5±0.01ms        ? ?/sec    1.01      4.5±0.02ms        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/async                                            1.01    887.2±1.68µs        ? ?/sec    1.00    880.6±2.13µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/sync                                             1.00      2.2±0.01ms        ? ?/sec    1.01      2.2±0.01ms        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/async                                  1.00    807.2±1.16µs        ? ?/sec    1.00    808.0±2.26µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/sync                                   1.00      2.1±0.01ms        ? ?/sec    1.02      2.2±0.02ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/async                                               1.00      7.5±0.02ms        ? ?/sec    1.02      7.7±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/sync                                                1.00      6.7±0.02ms        ? ?/sec    1.02      6.8±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/async                                     1.00      7.1±0.02ms        ? ?/sec    1.01      7.2±0.02ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/sync                                      1.00      6.2±0.02ms        ? ?/sec    1.02      6.4±0.03ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/async                                                1.00      5.0±0.02ms        ? ?/sec    1.00      5.0±0.02ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/sync                                                 1.00      5.4±0.02ms        ? ?/sec    1.00      5.4±0.02ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/async                                      1.02      4.7±0.02ms        ? ?/sec    1.00      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/sync                                       1.01      4.6±0.02ms        ? ?/sec    1.00      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/async                                               1.01      3.5±0.01ms        ? ?/sec    1.00      3.5±0.01ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/sync                                                1.01      3.7±0.01ms        ? ?/sec    1.00      3.7±0.01ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/async                                     1.01      3.2±0.01ms        ? ?/sec    1.00      3.2±0.01ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/sync                                      1.00      3.2±0.01ms        ? ?/sec    1.01      3.2±0.01ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/async                                           1.00      8.6±0.02ms        ? ?/sec    1.00      8.6±0.03ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/sync                                            1.00      9.3±0.03ms        ? ?/sec    1.01      9.3±0.04ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/async                                 1.00      7.1±0.02ms        ? ?/sec    1.02      7.2±0.03ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/sync                                  1.00      6.3±0.02ms        ? ?/sec    1.01      6.4±0.04ms        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/all_columns/limit10/async                            1.00    325.4±0.79µs        ? ?/sec    4.33   1408.0±6.25µs        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/exclude_filter_column/limit10/async                  1.00    320.3±1.14µs        ? ?/sec    4.01   1284.1±8.16µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/all_columns/limit10/async              1.00    365.6±1.05µs        ? ?/sec    6.33      2.3±0.01ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/exclude_filter_column/limit10/async    1.00    348.1±0.96µs        ? ?/sec    5.96      2.1±0.01ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/all_columns/limit10/async                             1.00    328.1±0.99µs        ? ?/sec    4.25   1394.4±4.71µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/exclude_filter_column/limit10/async                   1.00    321.6±1.48µs        ? ?/sec    3.96   1273.3±8.21µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/all_columns/limit10/async                                 1.00    326.5±1.67µs        ? ?/sec    3.74   1221.6±2.92µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/exclude_filter_column/limit10/async                       1.00    318.5±0.86µs        ? ?/sec    3.57   1137.1±2.06µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/all_columns/limit10/async                                  1.00    325.7±0.75µs        ? ?/sec    3.74   1219.5±4.41µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/exclude_filter_column/limit10/async                        1.00    316.8±1.16µs        ? ?/sec    3.63   1148.8±3.83µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/all_columns/limit10/async                                 1.00    336.6±1.04µs        ? ?/sec    3.63   1221.3±4.07µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/exclude_filter_column/limit10/async                       1.00    333.7±0.65µs        ? ?/sec    3.43   1144.7±1.96µs        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/all_columns/limit10/async                             1.00    352.0±2.63µs        ? ?/sec    11.08     3.9±0.02ms        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/exclude_filter_column/limit10/async                   1.00    337.8±0.95µs        ? ?/sec    10.50     3.5±0.01ms        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 472.7s
Peak memory 2.7 GiB
Avg memory 2.7 GiB
CPU user 471.8s
CPU sys 0.8s
Peak spill 0 B

branch

Metric Value
Wall time 476.1s
Peak memory 2.7 GiB
Avg memory 2.7 GiB
CPU user 475.8s
CPU sys 0.2s
Peak spill 0 B

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                                             fix-pushdown-limit-early-stop          main
-----                                             -----------------------------          ----
arrow_reader_clickbench/async/Q1                  1.01   1085.8±4.98µs        ? ?/sec    1.00   1079.1±4.53µs        ? ?/sec
arrow_reader_clickbench/async/Q10                 1.00      6.8±0.18ms        ? ?/sec    1.00      6.8±0.31ms        ? ?/sec
arrow_reader_clickbench/async/Q11                 1.00      7.4±0.04ms        ? ?/sec    1.01      7.4±0.05ms        ? ?/sec
arrow_reader_clickbench/async/Q12                 1.00     14.4±0.40ms        ? ?/sec    1.00     14.3±0.26ms        ? ?/sec
arrow_reader_clickbench/async/Q13                 1.00     16.8±0.46ms        ? ?/sec    1.01     16.9±0.32ms        ? ?/sec
arrow_reader_clickbench/async/Q14                 1.00     15.5±0.19ms        ? ?/sec    1.03     15.9±0.20ms        ? ?/sec
arrow_reader_clickbench/async/Q19                 1.00      3.0±0.05ms        ? ?/sec    1.06      3.1±0.09ms        ? ?/sec
arrow_reader_clickbench/async/Q20                 1.24     92.0±1.38ms        ? ?/sec    1.00     74.2±0.80ms        ? ?/sec
arrow_reader_clickbench/async/Q21                 1.30    106.1±1.88ms        ? ?/sec    1.00     81.8±0.50ms        ? ?/sec
arrow_reader_clickbench/async/Q22                 1.16    135.0±5.47ms        ? ?/sec    1.00    116.1±2.65ms        ? ?/sec
arrow_reader_clickbench/async/Q23                 1.00    239.7±3.02ms        ? ?/sec    1.06    253.0±3.29ms        ? ?/sec
arrow_reader_clickbench/async/Q24                 1.00     18.6±0.08ms        ? ?/sec    1.03     19.2±0.16ms        ? ?/sec
arrow_reader_clickbench/async/Q27                 1.00     57.3±0.61ms        ? ?/sec    1.03     58.9±0.72ms        ? ?/sec
arrow_reader_clickbench/async/Q28                 1.00     57.7±0.36ms        ? ?/sec    1.01     58.5±0.81ms        ? ?/sec
arrow_reader_clickbench/async/Q30                 1.00     18.0±0.13ms        ? ?/sec    1.02     18.4±0.13ms        ? ?/sec
arrow_reader_clickbench/async/Q36                 1.00     14.6±0.15ms        ? ?/sec    1.07     15.6±0.65ms        ? ?/sec
arrow_reader_clickbench/async/Q37                 1.00      5.3±0.09ms        ? ?/sec    1.04      5.5±0.08ms        ? ?/sec
arrow_reader_clickbench/async/Q38                 1.00     12.9±0.15ms        ? ?/sec    1.04     13.4±0.24ms        ? ?/sec
arrow_reader_clickbench/async/Q39                 1.00     23.5±0.52ms        ? ?/sec    1.07     25.0±0.88ms        ? ?/sec
arrow_reader_clickbench/async/Q40                 1.00      5.4±0.06ms        ? ?/sec    1.08      5.8±0.17ms        ? ?/sec
arrow_reader_clickbench/async/Q41                 1.00      4.8±0.08ms        ? ?/sec    1.01      4.9±0.06ms        ? ?/sec
arrow_reader_clickbench/async/Q42                 1.00      3.4±0.03ms        ? ?/sec    1.02      3.5±0.04ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q1     1.00   1052.2±2.98µs        ? ?/sec    1.00   1049.4±4.08µs        ? ?/sec
arrow_reader_clickbench/async_object_store/Q10    1.00      6.3±0.02ms        ? ?/sec    1.01      6.3±0.03ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q11    1.01      7.6±0.32ms        ? ?/sec    1.00      7.5±0.35ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q12    1.02     14.5±0.18ms        ? ?/sec    1.00     14.2±0.32ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q13    1.00     16.8±0.39ms        ? ?/sec    1.00     16.8±0.17ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q14    1.00     15.3±0.13ms        ? ?/sec    1.04     15.9±0.46ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q19    1.00      2.9±0.05ms        ? ?/sec    1.04      3.0±0.05ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q20    1.00     70.3±0.25ms        ? ?/sec    1.03     72.1±0.67ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q21    1.00     79.5±0.61ms        ? ?/sec    1.03     81.9±1.20ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q22    1.00     96.2±0.73ms        ? ?/sec    1.07    102.8±4.63ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q23    1.00    215.8±3.82ms        ? ?/sec    1.03    221.8±5.27ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q24    1.00     18.5±0.37ms        ? ?/sec    1.02     18.8±0.14ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q27    1.00     55.5±0.42ms        ? ?/sec    1.03     57.4±1.09ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q28    1.00     56.7±0.76ms        ? ?/sec    1.03     58.4±1.01ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q30    1.00     17.9±0.13ms        ? ?/sec    1.02     18.3±0.19ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q36    1.00     13.9±0.13ms        ? ?/sec    1.03     14.3±0.20ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q37    1.00      5.2±0.09ms        ? ?/sec    1.02      5.3±0.06ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q38    1.00     12.3±0.14ms        ? ?/sec    1.02     12.6±0.19ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q39    1.00     22.3±0.41ms        ? ?/sec    1.05     23.4±0.70ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q40    1.00      5.1±0.03ms        ? ?/sec    1.04      5.3±0.06ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q41    1.00      4.6±0.10ms        ? ?/sec    1.04      4.8±0.14ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q42    1.00      3.3±0.03ms        ? ?/sec    1.02      3.4±0.04ms        ? ?/sec
arrow_reader_clickbench/sync/Q1                   1.00    874.9±2.17µs        ? ?/sec    1.00    874.0±1.85µs        ? ?/sec
arrow_reader_clickbench/sync/Q10                  1.01      5.1±0.07ms        ? ?/sec    1.00      5.0±0.03ms        ? ?/sec
arrow_reader_clickbench/sync/Q11                  1.01      6.1±0.05ms        ? ?/sec    1.00      6.0±0.09ms        ? ?/sec
arrow_reader_clickbench/sync/Q12                  1.00     21.2±0.20ms        ? ?/sec    1.02     21.6±0.21ms        ? ?/sec
arrow_reader_clickbench/sync/Q13                  1.00     23.5±0.05ms        ? ?/sec    1.04     24.5±0.43ms        ? ?/sec
arrow_reader_clickbench/sync/Q14                  1.00     22.4±0.26ms        ? ?/sec    1.03     23.1±0.37ms        ? ?/sec
arrow_reader_clickbench/sync/Q19                  1.00      2.6±0.03ms        ? ?/sec    1.02      2.6±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q20                  1.00    119.0±1.36ms        ? ?/sec    1.07    126.8±2.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q21                  1.00     91.7±0.66ms        ? ?/sec    1.11    101.6±1.78ms        ? ?/sec
arrow_reader_clickbench/sync/Q22                  1.00    138.9±1.85ms        ? ?/sec    1.03    143.6±2.18ms        ? ?/sec
arrow_reader_clickbench/sync/Q23                  1.00   287.7±10.18ms        ? ?/sec    1.01    291.7±5.75ms        ? ?/sec
arrow_reader_clickbench/sync/Q24                  1.00     26.2±0.48ms        ? ?/sec    1.03     27.0±0.36ms        ? ?/sec
arrow_reader_clickbench/sync/Q27                  1.00    105.6±1.08ms        ? ?/sec    1.03    109.3±1.26ms        ? ?/sec
arrow_reader_clickbench/sync/Q28                  1.00    101.8±0.34ms        ? ?/sec    1.04    106.0±0.61ms        ? ?/sec
arrow_reader_clickbench/sync/Q30                  1.00     17.8±0.11ms        ? ?/sec    1.05     18.6±0.36ms        ? ?/sec
arrow_reader_clickbench/sync/Q36                  1.00     21.7±0.06ms        ? ?/sec    1.02     22.2±0.34ms        ? ?/sec
arrow_reader_clickbench/sync/Q37                  1.00      6.7±0.08ms        ? ?/sec    1.01      6.8±0.06ms        ? ?/sec
arrow_reader_clickbench/sync/Q38                  1.01     11.4±0.21ms        ? ?/sec    1.00     11.3±0.21ms        ? ?/sec
arrow_reader_clickbench/sync/Q39                  1.00     20.1±0.12ms        ? ?/sec    1.00     20.2±0.12ms        ? ?/sec
arrow_reader_clickbench/sync/Q40                  1.00      5.0±0.08ms        ? ?/sec    1.03      5.2±0.17ms        ? ?/sec
arrow_reader_clickbench/sync/Q41                  1.00      5.5±0.06ms        ? ?/sec    1.02      5.6±0.11ms        ? ?/sec
arrow_reader_clickbench/sync/Q42                  1.00      4.2±0.04ms        ? ?/sec    1.00      4.2±0.02ms        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 786.3s
Peak memory 3.1 GiB
Avg memory 2.9 GiB
CPU user 708.1s
CPU sys 77.8s
Peak spill 0 B

branch

Metric Value
Wall time 779.0s
Peak memory 3.2 GiB
Avg memory 3.1 GiB
CPU user 708.0s
CPU sys 71.1s
Peak spill 0 B

File an issue against this benchmark runner

@haohuaijin

Copy link
Copy Markdown
Contributor Author

🤖 Arrow criterion benchmark completed (GKE) | trigger

Details

group                                                                                              fix-pushdown-limit-early-stop          main
-----                                                                                              -----------------------------          ----
arrow_reader_row_filter/float64 <= 99.0/all_columns/async                                          1.00      5.3±0.02ms        ? ?/sec    1.02      5.4±0.01ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/all_columns/sync                                           1.00      5.2±0.02ms        ? ?/sec    1.01      5.3±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/async                                1.00      4.6±0.01ms        ? ?/sec    1.01      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/sync                                 1.00      4.5±0.02ms        ? ?/sec    1.01      4.5±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/async                            1.00      4.2±0.01ms        ? ?/sec    1.00      4.2±0.01ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/sync                             1.00      4.6±0.02ms        ? ?/sec    1.01      4.6±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/async                  1.00      3.7±0.02ms        ? ?/sec    1.01      3.8±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/sync                   1.00      3.7±0.01ms        ? ?/sec    1.00      3.7±0.01ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/async                                           1.00      5.3±0.02ms        ? ?/sec    1.01      5.4±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/sync                                            1.00      5.2±0.01ms        ? ?/sec    1.01      5.3±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/async                                 1.00      4.6±0.01ms        ? ?/sec    1.02      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/sync                                  1.00      4.5±0.01ms        ? ?/sec    1.01      4.5±0.02ms        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/async                                            1.01    887.2±1.68µs        ? ?/sec    1.00    880.6±2.13µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/sync                                             1.00      2.2±0.01ms        ? ?/sec    1.01      2.2±0.01ms        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/async                                  1.00    807.2±1.16µs        ? ?/sec    1.00    808.0±2.26µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/sync                                   1.00      2.1±0.01ms        ? ?/sec    1.02      2.2±0.02ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/async                                               1.00      7.5±0.02ms        ? ?/sec    1.02      7.7±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/sync                                                1.00      6.7±0.02ms        ? ?/sec    1.02      6.8±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/async                                     1.00      7.1±0.02ms        ? ?/sec    1.01      7.2±0.02ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/sync                                      1.00      6.2±0.02ms        ? ?/sec    1.02      6.4±0.03ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/async                                                1.00      5.0±0.02ms        ? ?/sec    1.00      5.0±0.02ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/sync                                                 1.00      5.4±0.02ms        ? ?/sec    1.00      5.4±0.02ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/async                                      1.02      4.7±0.02ms        ? ?/sec    1.00      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/sync                                       1.01      4.6±0.02ms        ? ?/sec    1.00      4.6±0.02ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/async                                               1.01      3.5±0.01ms        ? ?/sec    1.00      3.5±0.01ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/sync                                                1.01      3.7±0.01ms        ? ?/sec    1.00      3.7±0.01ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/async                                     1.01      3.2±0.01ms        ? ?/sec    1.00      3.2±0.01ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/sync                                      1.00      3.2±0.01ms        ? ?/sec    1.01      3.2±0.01ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/async                                           1.00      8.6±0.02ms        ? ?/sec    1.00      8.6±0.03ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/sync                                            1.00      9.3±0.03ms        ? ?/sec    1.01      9.3±0.04ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/async                                 1.00      7.1±0.02ms        ? ?/sec    1.02      7.2±0.03ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/sync                                  1.00      6.3±0.02ms        ? ?/sec    1.01      6.4±0.04ms        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/all_columns/limit10/async                            1.00    325.4±0.79µs        ? ?/sec    4.33   1408.0±6.25µs        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/exclude_filter_column/limit10/async                  1.00    320.3±1.14µs        ? ?/sec    4.01   1284.1±8.16µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/all_columns/limit10/async              1.00    365.6±1.05µs        ? ?/sec    6.33      2.3±0.01ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/exclude_filter_column/limit10/async    1.00    348.1±0.96µs        ? ?/sec    5.96      2.1±0.01ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/all_columns/limit10/async                             1.00    328.1±0.99µs        ? ?/sec    4.25   1394.4±4.71µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/exclude_filter_column/limit10/async                   1.00    321.6±1.48µs        ? ?/sec    3.96   1273.3±8.21µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/all_columns/limit10/async                                 1.00    326.5±1.67µs        ? ?/sec    3.74   1221.6±2.92µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/exclude_filter_column/limit10/async                       1.00    318.5±0.86µs        ? ?/sec    3.57   1137.1±2.06µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/all_columns/limit10/async                                  1.00    325.7±0.75µs        ? ?/sec    3.74   1219.5±4.41µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/exclude_filter_column/limit10/async                        1.00    316.8±1.16µs        ? ?/sec    3.63   1148.8±3.83µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/all_columns/limit10/async                                 1.00    336.6±1.04µs        ? ?/sec    3.63   1221.3±4.07µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/exclude_filter_column/limit10/async                       1.00    333.7±0.65µs        ? ?/sec    3.43   1144.7±1.96µs        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/all_columns/limit10/async                             1.00    352.0±2.63µs        ? ?/sec    11.08     3.9±0.02ms        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/exclude_filter_column/limit10/async                   1.00    337.8±0.95µs        ? ?/sec    10.50     3.5±0.01ms        ? ?/sec

Resource Usage
base (merge-base)

Metric Value
Wall time 472.7s
Peak memory 2.7 GiB
Avg memory 2.7 GiB
CPU user 471.8s
CPU sys 0.8s
Peak spill 0 B
branch

Metric Value
Wall time 476.1s
Peak memory 2.7 GiB
Avg memory 2.7 GiB
CPU user 475.8s
CPU sys 0.2s
Peak spill 0 B
File an issue against this benchmark runner

Hi @Dandandan @alamb the benchmark result look good, do you have time take a look for this pr?

@alamb

alamb commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_row_filter

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4307917664-1790-gxvkz 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 fix-pushdown-limit-early-stop (dbcf49d) to b93240a (merge-base) diff
BENCH_NAME=arrow_reader_row_filter
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_row_filter
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

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

Thank you @haohuaijin -- I think this looks really nice. I had one API design suggestion and a minor nitpick but otherwise 💯

Thank you

/// should have been passed to subsequent predicates.
///
/// If `limit` is `None` this behaves exactly like [`Self::with_predicate`].
pub fn with_predicate_limited(

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 @haohuaijin -- this actually makes a lot of sense to me 👍

I do think the API is somewhat unfortunate now (the fact we have to add a new function shows it isn't ideal.)

Would you be willing to make the API a little more future proof with something like the following?

struct PredicateOptions {
        array_reader: Box<dyn ArrayReader>,
        predicate: &mut dyn ArrowPredicate,
        limit: Option<usize>,
        total_rows: usize,
}
pub fn with_predicate_options(mut self, options: PredicateOptions) -> Result<Self> { 
...
}

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.

refactor in 8c3b313

Comment thread parquet/src/arrow/arrow_reader/read_plan.rs Outdated
Comment thread parquet/src/arrow/arrow_reader/read_plan.rs Outdated
Comment thread parquet/src/arrow/arrow_reader/read_plan.rs Outdated
@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                                                                                              fix-pushdown-limit-early-stop          main
-----                                                                                              -----------------------------          ----
arrow_reader_row_filter/float64 <= 99.0/all_columns/async                                          1.00      5.4±0.03ms        ? ?/sec    1.00      5.4±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/all_columns/sync                                           1.00      5.4±0.03ms        ? ?/sec    1.00      5.3±0.04ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/async                                1.00      4.7±0.03ms        ? ?/sec    1.01      4.7±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/sync                                 1.00      4.6±0.03ms        ? ?/sec    1.00      4.6±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/async                            1.00      4.3±0.03ms        ? ?/sec    1.00      4.3±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/sync                             1.00      4.6±0.04ms        ? ?/sec    1.01      4.7±0.05ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/async                  1.00      3.8±0.03ms        ? ?/sec    1.02      3.8±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/sync                   1.00      3.7±0.03ms        ? ?/sec    1.01      3.8±0.03ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/async                                           1.00      5.4±0.03ms        ? ?/sec    1.00      5.4±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/sync                                            1.00      5.4±0.04ms        ? ?/sec    1.00      5.4±0.05ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/async                                 1.00      4.7±0.03ms        ? ?/sec    1.01      4.7±0.02ms        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/sync                                  1.00      4.6±0.02ms        ? ?/sec    1.00      4.6±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/async                                            1.01    892.4±3.27µs        ? ?/sec    1.00    881.1±2.79µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/sync                                             1.00      2.2±0.01ms        ? ?/sec    1.01      2.2±0.01ms        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/async                                  1.01    813.0±2.53µs        ? ?/sec    1.00    808.6±2.52µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/sync                                   1.00      2.2±0.01ms        ? ?/sec    1.01      2.2±0.02ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/async                                               1.00      7.7±0.05ms        ? ?/sec    1.00      7.7±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/sync                                                1.00      6.9±0.04ms        ? ?/sec    1.00      6.8±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/async                                     1.00      7.1±0.03ms        ? ?/sec    1.01      7.2±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/sync                                      1.00      6.3±0.02ms        ? ?/sec    1.00      6.3±0.03ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/async                                                1.00      5.1±0.03ms        ? ?/sec    1.01      5.1±0.03ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/sync                                                 1.00      5.4±0.03ms        ? ?/sec    1.01      5.5±0.03ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/async                                      1.00      4.6±0.02ms        ? ?/sec    1.01      4.7±0.03ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/sync                                       1.00      4.7±0.03ms        ? ?/sec    1.00      4.7±0.03ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/async                                               1.00      3.5±0.02ms        ? ?/sec    1.00      3.5±0.02ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/sync                                                1.00      3.7±0.02ms        ? ?/sec    1.00      3.7±0.02ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/async                                     1.00      3.2±0.02ms        ? ?/sec    1.01      3.2±0.02ms        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/sync                                      1.00      3.2±0.03ms        ? ?/sec    1.01      3.2±0.02ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/async                                           1.00      8.6±0.03ms        ? ?/sec    1.00      8.6±0.03ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/sync                                            1.00      9.4±0.04ms        ? ?/sec    1.00      9.4±0.04ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/async                                 1.00      7.1±0.02ms        ? ?/sec    1.01      7.2±0.02ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/sync                                  1.00      6.4±0.03ms        ? ?/sec    1.01      6.4±0.03ms        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/all_columns/limit10/async                            1.00    345.1±1.56µs        ? ?/sec    4.17  1440.1±15.02µs        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/exclude_filter_column/limit10/async                  1.00    338.7±1.41µs        ? ?/sec    3.86  1307.4±15.57µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/all_columns/limit10/async              1.00    384.4±1.41µs        ? ?/sec    6.11      2.3±0.02ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/exclude_filter_column/limit10/async    1.00    368.1±1.93µs        ? ?/sec    5.71      2.1±0.02ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/all_columns/limit10/async                             1.00    345.6±1.38µs        ? ?/sec    4.16  1436.4±11.43µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/exclude_filter_column/limit10/async                   1.00    339.0±1.53µs        ? ?/sec    3.83  1299.4±13.84µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/all_columns/limit10/async                                 1.00    339.7±1.44µs        ? ?/sec    3.61   1227.4±4.45µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/exclude_filter_column/limit10/async                       1.00    333.4±1.41µs        ? ?/sec    3.40   1132.0±3.08µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/all_columns/limit10/async                                  1.00    336.9±1.26µs        ? ?/sec    3.64   1227.5±6.13µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/exclude_filter_column/limit10/async                        1.00    332.6±1.37µs        ? ?/sec    3.43   1141.2±4.45µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/all_columns/limit10/async                                 1.00    354.3±1.01µs        ? ?/sec    3.46   1225.8±4.63µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/exclude_filter_column/limit10/async                       1.00    345.2±1.39µs        ? ?/sec    3.30   1140.8±3.69µs        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/all_columns/limit10/async                             1.00    363.6±1.40µs        ? ?/sec    10.90     4.0±0.01ms        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/exclude_filter_column/limit10/async                   1.00    355.7±1.89µs        ? ?/sec    10.08     3.6±0.01ms        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 480.1s
Peak memory 4.3 GiB
Avg memory 4.3 GiB
CPU user 474.8s
CPU sys 0.8s
Peak spill 0 B

branch

Metric Value
Wall time 475.1s
Peak memory 4.2 GiB
Avg memory 4.2 GiB
CPU user 470.3s
CPU sys 0.2s
Peak spill 0 B

File an issue against this benchmark runner

@alamb

alamb commented Apr 23, 2026

Copy link
Copy Markdown
Contributor
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/sync                                  1.00      6.4±0.03ms        ? ?/sec    1.01      6.4±0.03ms        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/all_columns/limit10/async                            1.00    345.1±1.56µs        ? ?/sec    4.17  1440.1±15.02µs        ? ?/sec
arrow_reader_row_filter_limit/float64 <= 99.0/exclude_filter_column/limit10/async                  1.00    338.7±1.41µs        ? ?/sec    3.86  1307.4±15.57µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/all_columns/limit10/async              1.00    384.4±1.41µs        ? ?/sec    6.11      2.3±0.02ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0 AND ts >= 9000/exclude_filter_column/limit10/async    1.00    368.1±1.93µs        ? ?/sec    5.71      2.1±0.02ms        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/all_columns/limit10/async                             1.00    345.6±1.38µs        ? ?/sec    4.16  1436.4±11.43µs        ? ?/sec
arrow_reader_row_filter_limit/float64 > 99.0/exclude_filter_column/limit10/async                   1.00    339.0±1.53µs        ? ?/sec    3.83  1299.4±13.84µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/all_columns/limit10/async                                 1.00    339.7±1.44µs        ? ?/sec    3.61   1227.4±4.45µs        ? ?/sec
arrow_reader_row_filter_limit/int64 > 90/exclude_filter_column/limit10/async                       1.00    333.4±1.41µs        ? ?/sec    3.40   1132.0±3.08µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/all_columns/limit10/async                                  1.00    336.9±1.26µs        ? ?/sec    3.64   1227.5±6.13µs        ? ?/sec
arrow_reader_row_filter_limit/ts < 9000/exclude_filter_column/limit10/async                        1.00    332.6±1.37µs        ? ?/sec    3.43   1141.2±4.45µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/all_columns/limit10/async                                 1.00    354.3±1.01µs        ? ?/sec    3.46   1225.8±4.63µs        ? ?/sec
arrow_reader_row_filter_limit/ts >= 9000/exclude_filter_column/limit10/async                       1.00    345.2±1.39µs        ? ?/sec    3.30   1140.8±3.69µs        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/all_columns/limit10/async                             1.00    363.6±1.40µs        ? ?/sec    10.90     4.0±0.01ms        ? ?/sec
arrow_reader_row_filter_limit/utf8View <> ''/exclude_filter_column/limit10/async                   1.00    355.7±1.89µs        ? ?/sec    10.08     3.6±0.01ms        ? ?/sec

Those are some sweet results @haohuaijin 😎

@haohuaijin

Copy link
Copy Markdown
Contributor Author

thanks very much for your reviews and great suggestions @alamb , i apply your suggestion in 8c3b313

@alamb alamb 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 @haohuaijin - looks great to me

///
/// Only valid for the *last* predicate in a filter chain: intermediate
/// predicates' match counts do not map 1:1 to output rows.
pub fn with_limit(mut self, limit: usize, total_rows: usize) -> Self {

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.

this is nice API that makes it clear limit and total rows is required

@alamb alamb merged commit a3592d6 into apache:main Apr 24, 2026
16 checks passed
@haohuaijin haohuaijin deleted the fix-pushdown-limit-early-stop branch April 25, 2026 03:25
sdf-jkl added a commit to sdf-jkl/arrow-rs that referenced this pull request May 14, 2026
Conflicts resolved:
- read_plan.rs: unify with_predicate(row_count) as delegator to
  with_predicate_options; carry row_count via PredicateOptions::with_total_rows
  so LIMIT/OFFSET (upstream apache#9766) and deferral metrics coexist.
- push_decoder/reader_builder/mod.rs: call site uses with_predicate_options
  with always-set total_rows plus conditional with_limit.
- RowGroupDecoderState size assertion updated to 288 to reflect both upstream
  and PR field additions.
Rich-T-kid pushed a commit to Rich-T-kid/arrow-rs that referenced this pull request Jun 2, 2026
…#9767)

# Which issue does this PR close?

<!--
We generally require a GitHub issue to be filed for all bug fixes and
enhancements and this helps us generate change logs for our releases.
You can link an issue to this PR using the GitHub syntax.
-->

- part of apache#9766 

# Rationale for this change

<!--
Why are you proposing this change? If this is already explained clearly
in the issue then this section is not needed.
Explaining clearly why changes are proposed helps reviewers understand
your changes and offer better suggestions for fixes.
-->

# What changes are included in this PR?

<!--
There is no need to duplicate the description in the issue here but it
is sometimes worth providing a summary of the individual changes in this
PR.
-->

# Are these changes tested?

<!--
We typically require tests for all PRs in order to:
1. Prevent the code from being accidentally broken by subsequent changes
2. Serve as another way to document the expected behavior of the code

If tests are not included in your PR, please explain why (for example,
are they covered by existing tests)?
-->

# Are there any user-facing changes?

<!--
If there are user-facing changes then we may require documentation to be
updated before approving the PR.

If there are any breaking changes to public APIs, please call them out.
-->
Rich-T-kid pushed a commit to Rich-T-kid/arrow-rs that referenced this pull request Jun 2, 2026
…unused row groups (apache#9766)

# Which issue does this PR close?

- Closes apache#9765

# Rationale for this change

- See apache#9765.

# What changes are included in this PR?

Push `LIMIT + OFFSET` into the last `RowFilter` predicate and skip row
groups once the limit is exhausted.

1. **Within a row group.** New `ReadPlanBuilder::with_predicate_limited`
takes an optional cap; once cumulative matches reach it, the batch
filter is truncated and the reader loop breaks. The tail is padded as
"not selected" so `RowSelection` still spans the full row group.
`with_predicate` becomes a thin wrapper passing `None`.

2. **Across row groups.** `RowGroupReaderBuilder::transition`
short-circuits `Start → Finished` when `limit == Some(0)`, skipping
filter-plan setup and predicate-column fetches.

3. **Wiring.** `FilterInfo::is_last` marks the final predicate; the call
site passes `Some(limit + offset)` only for it (offset is included
because `with_offset` runs after the predicate).

# Are these changes tested?

- Unit tests for `truncate_filter_after_n_trues` and tail-padding in
`with_predicate_limited`.
- End-to-end decoder tests covering: short-circuit within a row group,
later row groups not fetched, correct `offset + limit` window,
multi-predicate chains short-circuiting only on the last predicate, and
preservation with a prior `RowSelection`. Predicate-invocation counters
verify fewer rows are evaluated.
- New `benchmark_filters_with_limit` group in
`arrow_reader_row_filter.rs` with `LIMIT 10`.

# Are there any user-facing changes?

- New public `ReadPlanBuilder::with_predicate_limited`; `with_predicate`
unchanged. No breaking changes.
- `RowFilter` + `with_limit`/`with_offset` reads now decode fewer
predicate pages. Output is identical.

---------

Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
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 performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

short-circuit last predicate in RowFilter when with_limit(N) is set

4 participants