Skip to content

perf(parquet): fuse consecutive filters on the same projection - #10859

Open
haohuaijin wants to merge 13 commits into
apache:mainfrom
haohuaijin:parquet-same-projection-filter-fusion
Open

haohuaijin wants to merge 13 commits into
apache:mainfrom
haohuaijin:parquet-same-projection-filter-fusion

Conversation

@haohuaijin

@haohuaijin haohuaijin commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

Consecutive same-projection predicates can repeatedly decode a column or replay it from the predicate cache. The push decoder now wraps eligible groups in a FusedPredicate and evaluates them from one decoded stream. Predicates keep their order, and later predicates receive only surviving rows.

Fusion is limited to a single top-level, non-repeated leaf. Contiguous survivors use zero-copy slices; fragmented survivors use filter_record_batch. Intermediate selections follow the reader's RowSelectionPolicy, so the default Auto policy switches between RowSelector runs and bitmaps by run density.

The synchronous reader is unchanged and is left as a follow-up: it has no predicate cache, so it would benefit at least as much, but this PR keeps fusion inside the push decoder.

There is no option to disable fusion. The measured regressions are bounded (see below) and only appear where compaction of ~50% survivors costs more than the saved decode.

What changes are included?

  • Group eligible consecutive predicates before building the push decoder.
  • Reuse the existing predicate execution path, including output-limit handling.
  • Adapt the accumulated selection once per composition, following the row selection policy.
  • Document the fusion in the RowFilter docs.

Performance

ClickBench Q25 (SELECT "SearchPhrase" FROM hits WHERE "SearchPhrase" <> '' ORDER BY "SearchPhrase" LIMIT 10) has two predicates on SearchPhrase once the TopK dynamic filter is pushed down, so the pair is fused.

Measured with DataFusion eea8c0961 dfbench clickbench on the partitioned 100-file dataset, 12 partitions, batch size 8192, [patch.crates-io] pointing the arrow crates at local checkouts. DataFusion builds against the released 59.x API, so main is the 59.3.0 tag and fusion is 59.3.0 plus this PR's diff. Three interleaved rounds of 40 iterations per variant, 120 samples each:

Variant Median Per-round medians
main, pushdown off 120.73 ms 121.0 / 120.2 / 121.5
main, pushdown on 146.67 ms 146.9 / 146.6 / 146.7
fusion, pushdown on 119.46 ms 120.1 / 117.6 / 119.8

Fusion removes the 21% cost that enabling pushdown adds on main for this query: fusion/on is 18.6% faster than main/on and 1.1% faster than main/off.

Testing

  • Fused/sequential selection equivalence, including prior selections, nulls, and early termination.
  • Projection eligibility, adaptive storage, and zero-copy slicing tests.
  • Push-decoder end-to-end coverage, including output limits.
  • Parquet library tests and async-reader tests.

User-facing changes

No public API changes. RowFilter docs now describe when consecutive predicates share one decode.

@haohuaijin

haohuaijin commented Aug 31, 2026

Copy link
Copy Markdown
Contributor Author

Replace the dedicated `with_same_projection_predicates` loop and the
predicate-group bookkeeping in the push decoder state machine with a
crate-private `FusedPredicate` that implements `ArrowPredicate`.
`RowFilter::fuse_same_projection` groups consecutive predicates that share a
single-leaf projection once at build time, so `ReadPlanBuilder`, `FilterInfo`
and the LIMIT short-circuit work unchanged and the sync reader gets fusion
for free.

Within a batch the accepted rows are tracked as a `RowSelection` whose
mask/selector backing follows the reader's `RowSelectionPolicy`, via the new
`RowSelectionPolicy::resolve` and `RowSelection::into_boolean_buffer`.
@github-actions github-actions Bot added the parquet Changes to the parquet crate label Sep 5, 2026
Only the accumulated selection drives the composition algorithm in
`FusedPredicate::evaluate`, so adapt it once, right before it is used as
the left operand of `and_then`. The per-predicate mask is composed as-is
and the last predicate's result is no longer converted, which removes one
strategy scan per rejecting predicate and a mask-to-selectors-to-mask
round trip on the final predicate.

Interleaved benchmark runs on the int64 cases show a geometric-mean
speedup of about 2%, and 9-15% on eight-predicate fragmented chains with
99% survivors, with no regressions.
@haohuaijin

Copy link
Copy Markdown
Contributor Author

the benchmark result of arrow_reader_predicate_fusion from #11007, main dbd24cc vs this PR rebased on it:

  • uncached chains gain the most, up to 3.6x (string/fragmented/uncached/4/*), since main decodes the filter column once per predicate.
  • cached chains gain 3% to 46%, where main only replays the predicate cache.
  • Three cases with 50% survivors are 3% to 6% slower, where compacting survivors costs more than the saved decode.
benchmark result

@haohuaijin
haohuaijin marked this pull request as ready for review September 6, 2026 15:05
@haohuaijin
haohuaijin force-pushed the parquet-same-projection-filter-fusion branch from f78e300 to 9093f55 Compare September 6, 2026 15:54
@haohuaijin

Copy link
Copy Markdown
Contributor Author

Hi @alamb, would you have time to review this?

The idea is that consecutive RowFilter predicates on the same column are evaluated together on one decoded batch, instead of each predicate decoding the column again or replaying it from the predicate cache. The core change is in parquet/src/arrow/arrow_reader/filter.rs.

I'd like to know whether you think this is a good direction.

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

Related to #10926.

# Rationale for this change

`RowFilter` evaluates each `ArrowPredicate` separately, so consecutive
predicates on the same projection decode that column, or replay it from
the predicate cache, once per predicate. #10859 fuses such chains. Per
the contributing guide, the benchmark is submitted separately so it can
run on the automated runner and serve as the baseline for that change.

# What changes are included in this PR?

A criterion benchmark,
`parquet/benches/arrow_reader_predicate_fusion.rs`, that scans an
in-memory Snappy Parquet file of 262,144 rows through the async reader.
Case names are `type/layout/cache/predicates/profile`:

- `4/all99` chains across both column types (`int64`, `string`), layouts
(`fragmented`, `clustered`), and cache modes (`cached`, `uncached`): 8
cases
- fragmented `1/all99` controls, `2/all99`, and `2/all50` chains across
both types and cache modes: 12 cases
- clustered uncached `2/all50` and `4/all50` chains across both types,
retaining cases where fusion has shown regressions: 4 cases
- `int64/fragmented/4` with `early1` and `late1` across both cache
modes, covering predicate ordering: 4 cases
- a `selection_boundary` group with run lengths 16 and 64 on either side
of the default row selection policy threshold: 2 cases

30 cases in total. Each case is validated once outside measurement for
the expected row count and predicate cache use. Run-length cases also
validate the predicate mask run lengths.

# Are these changes tested?

The benchmark builds and all 30 cases pass with `cargo bench -p parquet
--bench arrow_reader_predicate_fusion --features "arrow async snap"
--locked -- --test`.

# Are there any user-facing changes?

No.
@alamb

alamb commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_predicate_fusion

1 similar comment
@alamb

alamb commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_predicate_fusion

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5740880642-2483-4zwlm 6.12.94+ #1 SMP Tue Aug 4 08:44:15 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 parquet-same-projection-filter-fusion (916b65c) to a7b89dd (merge-base) diff

Run configuration
run benchmark arrow_reader_predicate_fusion

BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_predicate_fusion
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-c5740880198-2482-6mbxg 6.12.94+ #1 SMP Tue Aug 4 08:44:15 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 parquet-same-projection-filter-fusion (916b65c) to a7b89dd (merge-base) diff

Run configuration
run benchmark arrow_reader_predicate_fusion

BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_predicate_fusion
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)

Comparing parquet-same-projection-filter-fusion (916b65c) to a7b89dd (merge-base) diff

Run configuration
run benchmark arrow_reader_predicate_fusion
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                                                               main                                    parquet-same-projection-filter-fusion
-----                                                               ----                                    -------------------------------------
same_projection_filter/int64/clustered/cached/4/all99               1.15      2.4±0.00ms 105.4 MElem/sec    1.00      2.1±0.00ms 121.0 MElem/sec
same_projection_filter/int64/clustered/uncached/2/all50             1.00      2.8±0.02ms 89.0 MElem/sec     1.02      2.9±0.01ms 87.3 MElem/sec
same_projection_filter/int64/clustered/uncached/4/all50             1.00      3.1±0.01ms 81.3 MElem/sec     1.00      3.1±0.01ms 81.7 MElem/sec
same_projection_filter/int64/clustered/uncached/4/all99             1.06      4.2±0.01ms 59.5 MElem/sec     1.00      3.9±0.01ms 63.3 MElem/sec
same_projection_filter/int64/fragmented/cached/1/all99              1.00      2.9±0.00ms 86.6 MElem/sec     1.01      2.9±0.01ms 86.0 MElem/sec
same_projection_filter/int64/fragmented/cached/2/all50              1.07      4.4±0.02ms 56.8 MElem/sec     1.00      4.1±0.01ms 60.8 MElem/sec
same_projection_filter/int64/fragmented/cached/2/all99              1.04      3.8±0.02ms 65.1 MElem/sec     1.00      3.7±0.02ms 67.8 MElem/sec
same_projection_filter/int64/fragmented/cached/4/all99              1.00      5.8±0.01ms 42.9 MElem/sec     1.02      5.9±0.01ms 42.1 MElem/sec
same_projection_filter/int64/fragmented/cached/4/early1             1.12      3.3±0.01ms 74.9 MElem/sec     1.00      3.0±0.02ms 83.8 MElem/sec
same_projection_filter/int64/fragmented/cached/4/late1              1.04      5.5±0.02ms 45.1 MElem/sec     1.00      5.3±0.01ms 47.1 MElem/sec
same_projection_filter/int64/fragmented/uncached/1/all99            1.00      5.0±0.03ms 49.8 MElem/sec     1.00      5.0±0.03ms 50.0 MElem/sec
same_projection_filter/int64/fragmented/uncached/2/all50            1.36      8.3±0.04ms 30.3 MElem/sec     1.00      6.1±0.02ms 41.3 MElem/sec
same_projection_filter/int64/fragmented/uncached/2/all99            1.40      7.9±0.03ms 31.7 MElem/sec     1.00      5.6±0.01ms 44.5 MElem/sec
same_projection_filter/int64/fragmented/uncached/4/all99            1.76     13.7±0.06ms 18.3 MElem/sec     1.00      7.8±0.01ms 32.1 MElem/sec
same_projection_filter/int64/fragmented/uncached/4/early1           2.21     10.6±0.04ms 23.7 MElem/sec     1.00      4.8±0.01ms 52.2 MElem/sec
same_projection_filter/int64/fragmented/uncached/4/late1            1.88     13.3±0.02ms 18.8 MElem/sec     1.00      7.1±0.02ms 35.4 MElem/sec
same_projection_filter/selection_boundary/int64/uncached/4/run16    2.17     11.7±0.06ms 21.3 MElem/sec     1.00      5.4±0.01ms 46.2 MElem/sec
same_projection_filter/selection_boundary/int64/uncached/4/run64    2.07     10.6±0.02ms 23.7 MElem/sec     1.00      5.1±0.02ms 49.1 MElem/sec
same_projection_filter/string/clustered/cached/4/all99              1.29      7.8±0.13ms 32.0 MElem/sec     1.00      6.0±0.04ms 41.4 MElem/sec
same_projection_filter/string/clustered/uncached/2/all50            1.00      4.9±0.01ms 51.2 MElem/sec     1.04      5.1±0.03ms 49.1 MElem/sec
same_projection_filter/string/clustered/uncached/4/all50            1.00      5.9±0.02ms 42.5 MElem/sec     1.01      6.0±0.04ms 42.0 MElem/sec
same_projection_filter/string/clustered/uncached/4/all99            1.40      9.3±0.03ms 26.7 MElem/sec     1.00      6.7±0.01ms 37.4 MElem/sec
same_projection_filter/string/fragmented/cached/1/all99             1.00     33.5±0.65ms  7.5 MElem/sec     1.02     34.3±0.86ms  7.3 MElem/sec
same_projection_filter/string/fragmented/cached/2/all50             1.23     37.5±0.92ms  6.7 MElem/sec     1.00     30.6±3.05ms  8.2 MElem/sec
same_projection_filter/string/fragmented/cached/2/all99             1.00     36.1±0.81ms  6.9 MElem/sec     1.06     38.2±0.22ms  6.5 MElem/sec
same_projection_filter/string/fragmented/cached/4/all99             1.08     40.1±0.87ms  6.2 MElem/sec     1.00     37.0±4.47ms  6.8 MElem/sec
same_projection_filter/string/fragmented/uncached/1/all99           1.00     26.0±0.15ms  9.6 MElem/sec     1.00     26.0±0.15ms  9.6 MElem/sec
same_projection_filter/string/fragmented/uncached/2/all50           1.81     50.5±0.24ms  5.0 MElem/sec     1.00     27.8±0.16ms  9.0 MElem/sec
same_projection_filter/string/fragmented/uncached/2/all99           1.79     49.2±0.28ms  5.1 MElem/sec     1.00     27.5±0.11ms  9.1 MElem/sec
same_projection_filter/string/fragmented/uncached/4/all99           3.11     98.2±0.44ms  2.5 MElem/sec     1.00     31.6±0.16ms  7.9 MElem/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 315.1s
Peak memory 50.9 MiB
Avg memory 37.8 MiB
CPU user 301.2s
CPU sys 10.9s
Peak spill 0 B

branch

Metric Value
Wall time 300.1s
Peak memory 50.6 MiB
Avg memory 39.3 MiB
CPU user 287.4s
CPU sys 9.0s
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)

Comparing parquet-same-projection-filter-fusion (916b65c) to a7b89dd (merge-base) diff

Run configuration
run benchmark arrow_reader_predicate_fusion
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                                                               main                                    parquet-same-projection-filter-fusion
-----                                                               ----                                    -------------------------------------
same_projection_filter/int64/clustered/cached/4/all99               1.13      2.4±0.01ms 106.3 MElem/sec    1.00      2.1±0.01ms 120.6 MElem/sec
same_projection_filter/int64/clustered/uncached/2/all50             1.00      2.8±0.01ms 88.0 MElem/sec     1.00      2.9±0.01ms 87.7 MElem/sec
same_projection_filter/int64/clustered/uncached/4/all50             1.00      3.1±0.01ms 81.5 MElem/sec     1.01      3.1±0.01ms 81.0 MElem/sec
same_projection_filter/int64/clustered/uncached/4/all99             1.08      4.3±0.02ms 58.5 MElem/sec     1.00      4.0±0.02ms 63.3 MElem/sec
same_projection_filter/int64/fragmented/cached/1/all99              1.01      3.0±0.02ms 84.4 MElem/sec     1.00      2.9±0.02ms 85.4 MElem/sec
same_projection_filter/int64/fragmented/cached/2/all50              1.06      4.5±0.04ms 56.2 MElem/sec     1.00      4.2±0.03ms 59.7 MElem/sec
same_projection_filter/int64/fragmented/cached/2/all99              1.05      3.9±0.03ms 64.4 MElem/sec     1.00      3.7±0.04ms 67.5 MElem/sec
same_projection_filter/int64/fragmented/cached/4/all99              1.00      5.9±0.06ms 42.3 MElem/sec     1.02      6.1±0.05ms 41.3 MElem/sec
same_projection_filter/int64/fragmented/cached/4/early1             1.12      3.4±0.02ms 73.7 MElem/sec     1.00      3.0±0.01ms 82.6 MElem/sec
same_projection_filter/int64/fragmented/cached/4/late1              1.03      5.5±0.03ms 45.1 MElem/sec     1.00      5.4±0.03ms 46.6 MElem/sec
same_projection_filter/int64/fragmented/uncached/1/all99            1.00      5.0±0.03ms 49.7 MElem/sec     1.01      5.1±0.03ms 49.3 MElem/sec
same_projection_filter/int64/fragmented/uncached/2/all50            1.36      8.3±0.04ms 30.2 MElem/sec     1.00      6.1±0.07ms 41.2 MElem/sec
same_projection_filter/int64/fragmented/uncached/2/all99            1.41      7.9±0.03ms 31.7 MElem/sec     1.00      5.6±0.03ms 44.5 MElem/sec
same_projection_filter/int64/fragmented/uncached/4/all99            1.73     13.9±0.06ms 18.0 MElem/sec     1.00      8.0±0.04ms 31.1 MElem/sec
same_projection_filter/int64/fragmented/uncached/4/early1           2.23     10.6±0.06ms 23.7 MElem/sec     1.00      4.7±0.03ms 52.9 MElem/sec
same_projection_filter/int64/fragmented/uncached/4/late1            1.90     13.3±0.08ms 18.7 MElem/sec     1.00      7.0±0.04ms 35.5 MElem/sec
same_projection_filter/selection_boundary/int64/uncached/4/run16    2.20     11.9±0.06ms 21.0 MElem/sec     1.00      5.4±0.04ms 46.1 MElem/sec
same_projection_filter/selection_boundary/int64/uncached/4/run64    2.08     10.7±0.05ms 23.3 MElem/sec     1.00      5.2±0.04ms 48.4 MElem/sec
same_projection_filter/string/clustered/cached/4/all99              1.34      8.2±0.28ms 30.3 MElem/sec     1.00      6.2±0.11ms 40.6 MElem/sec
same_projection_filter/string/clustered/uncached/2/all50            1.00      4.9±0.02ms 51.2 MElem/sec     1.07      5.2±0.03ms 47.7 MElem/sec
same_projection_filter/string/clustered/uncached/4/all50            1.00      5.9±0.02ms 42.7 MElem/sec     1.03      6.0±0.04ms 41.6 MElem/sec
same_projection_filter/string/clustered/uncached/4/all99            1.36      9.3±0.02ms 26.8 MElem/sec     1.00      6.8±0.02ms 36.6 MElem/sec
same_projection_filter/string/fragmented/cached/1/all99             1.00     35.4±0.54ms  7.1 MElem/sec     1.04     36.9±0.73ms  6.8 MElem/sec
same_projection_filter/string/fragmented/cached/2/all50             1.08     38.6±0.85ms  6.5 MElem/sec     1.00     35.8±4.76ms  7.0 MElem/sec
same_projection_filter/string/fragmented/cached/2/all99             1.00     37.4±0.85ms  6.7 MElem/sec     1.03     38.6±0.28ms  6.5 MElem/sec
same_projection_filter/string/fragmented/cached/4/all99             1.09     42.1±0.89ms  5.9 MElem/sec     1.00     38.7±3.81ms  6.5 MElem/sec
same_projection_filter/string/fragmented/uncached/1/all99           1.01     26.6±0.16ms  9.4 MElem/sec     1.00     26.5±0.08ms  9.4 MElem/sec
same_projection_filter/string/fragmented/uncached/2/all50           1.84     51.7±0.55ms  4.8 MElem/sec     1.00     28.1±0.13ms  8.9 MElem/sec
same_projection_filter/string/fragmented/uncached/2/all99           1.79     49.9±0.33ms  5.0 MElem/sec     1.00     27.8±0.13ms  9.0 MElem/sec
same_projection_filter/string/fragmented/uncached/4/all99           3.05     98.8±0.59ms  2.5 MElem/sec     1.00     32.5±0.20ms  7.7 MElem/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 310.1s
Peak memory 50.3 MiB
Avg memory 37.6 MiB
CPU user 293.2s
CPU sys 11.9s
Peak spill 0 B

branch

Metric Value
Wall time 305.1s
Peak memory 51.9 MiB
Avg memory 37.8 MiB
CPU user 289.0s
CPU sys 11.4s
Peak spill 0 B

File an issue against this benchmark runner

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

Labels

parquet Changes to the parquet crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Parquet: support same-projection RowFilter fusion

3 participants