Skip to content

Enable dynamic filters for range-partitioned joins - #23854

Open
peterxcli wants to merge 25 commits into
apache:mainfrom
peterxcli:feat/hash-join-dynamic-filter-with-range-partition
Open

Enable dynamic filters for range-partitioned joins#23854
peterxcli wants to merge 25 commits into
apache:mainfrom
peterxcli:feat/hash-join-dynamic-filter-with-range-partition

Conversation

@peterxcli

@peterxcli peterxcli commented Jul 23, 2026

Copy link
Copy Markdown
Member

Which issue does this PR close?

Rationale for this change

Partitioned hash joins build one dynamic filter per build partition. Existing routing uses hash(key) % N, which cannot reproduce a Range partitioning layout.
Compatible Range co-partitioned joins instead need to route probe rows using their existing ordering and split points.

What changes are included in this PR?

  • Enable dynamic filter pushdown for hash joins with compatible Range-partitioned inputs.
  • Build a searched CASE expression that routes probe rows to the corresponding partition filter using the Range ordering and split points.
  • Move the TopK lexicographic filter builder into the shared ordering module for reuse.

Are these changes tested?

unit test.

Are there any user-facing changes?

Yes. This PR adds RangeExpr to the physical-expression protobuf model, which adds the public ExprType::RangeExpr enum variant. Downstream Rust consumers that exhaustively match ExprType must handle the new variant.

It also enables dynamic-filter pushdown for compatible Range-partitioned joins.

@github-actions github-actions Bot added the physical-plan Changes to the physical-plan crate label Jul 23, 2026

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

Great work! 😁

Comment thread datafusion/physical-plan/src/joins/hash_join/shared_bounds.rs Outdated
Comment thread datafusion/physical-plan/src/joins/hash_join/shared_bounds.rs Outdated
Comment thread datafusion/physical-plan/src/ordering.rs Outdated
@peterxcli
peterxcli requested a review from saadtajwar July 24, 2026 19:15
@peterxcli

Copy link
Copy Markdown
Member Author

cc @gene-bordegaray @jayshrivastava @stuhood @adriangb — kindly pinging on this one. Please take a look if you have time, thanks!

@codecov-commenter

codecov-commenter commented Jul 24, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 79.51220% with 126 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.00%. Comparing base (a05388e) to head (7274de3).

Files with missing lines Patch % Lines
datafusion/proto-models/src/generated/pbjson.rs 0.00% 70 Missing ⚠️
datafusion/physical-plan/src/repartition/mod.rs 84.69% 14 Missing and 16 partials ⚠️
...physical-plan/src/joins/hash_join/shared_bounds.rs 92.79% 10 Missing and 7 partials ⚠️
...tafusion/physical-plan/src/joins/hash_join/exec.rs 88.73% 3 Missing and 5 partials ⚠️
datafusion/proto/src/physical_plan/from_proto.rs 0.00% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #23854      +/-   ##
==========================================
- Coverage   81.01%   81.00%   -0.02%     
==========================================
  Files        1106     1106              
  Lines      383974   384464     +490     
  Branches   383974   384464     +490     
==========================================
+ Hits       311085   311433     +348     
- Misses      54554    54664     +110     
- Partials    18335    18367      +32     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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

Great work!

@comphead

Copy link
Copy Markdown
Contributor

run benchmark tpch tpcds

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5080112985-1264-twmtz 6.12.85+ #1 SMP Mon May 11 08:17:35 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 feat/hash-join-dynamic-filter-with-range-partition (1a141f3) to 1763417 (merge-base) diff using: tpch
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5080112985-1265-sp4z6 6.12.85+ #1 SMP Mon May 11 08:17:35 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 feat/hash-join-dynamic-filter-with-range-partition (1a141f3) to 1763417 (merge-base) diff using: tpcds
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 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

Comparing HEAD and feat_hash-join-dynamic-filter-with-range-partition
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃ feat_hash-join-dynamic-filter-with-range-partition ┃    Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ QQuery 1  │ 38.40 / 39.27 ±0.96 / 41.13 ms │                     38.82 / 40.64 ±1.31 / 42.50 ms │ no change │
│ QQuery 2  │ 19.49 / 19.70 ±0.25 / 20.16 ms │                     19.32 / 20.13 ±0.90 / 21.35 ms │ no change │
│ QQuery 3  │ 31.13 / 32.66 ±1.15 / 34.45 ms │                     31.29 / 33.50 ±1.12 / 34.23 ms │ no change │
│ QQuery 4  │ 17.69 / 18.17 ±0.42 / 18.68 ms │                     17.59 / 17.72 ±0.12 / 17.91 ms │ no change │
│ QQuery 5  │ 40.28 / 40.87 ±0.49 / 41.43 ms │                     38.30 / 41.08 ±1.83 / 44.02 ms │ no change │
│ QQuery 6  │ 16.22 / 16.88 ±1.02 / 18.90 ms │                     16.67 / 17.56 ±0.81 / 18.70 ms │ no change │
│ QQuery 7  │ 43.85 / 46.20 ±1.59 / 48.28 ms │                     44.63 / 47.95 ±2.25 / 51.19 ms │ no change │
│ QQuery 8  │ 42.79 / 43.47 ±1.07 / 45.59 ms │                     42.92 / 43.12 ±0.13 / 43.28 ms │ no change │
│ QQuery 9  │ 50.22 / 51.42 ±0.91 / 52.55 ms │                     48.99 / 49.81 ±0.62 / 50.87 ms │ no change │
│ QQuery 10 │ 42.38 / 42.57 ±0.21 / 42.88 ms │                     42.58 / 42.71 ±0.11 / 42.87 ms │ no change │
│ QQuery 11 │ 13.66 / 13.84 ±0.14 / 14.01 ms │                     13.85 / 13.88 ±0.03 / 13.93 ms │ no change │
│ QQuery 12 │ 23.50 / 23.81 ±0.31 / 24.35 ms │                     23.74 / 24.19 ±0.37 / 24.84 ms │ no change │
│ QQuery 13 │ 32.84 / 33.94 ±1.01 / 35.76 ms │                     32.69 / 34.73 ±2.49 / 39.62 ms │ no change │
│ QQuery 14 │ 23.50 / 23.77 ±0.15 / 23.94 ms │                     23.75 / 24.05 ±0.21 / 24.34 ms │ no change │
│ QQuery 15 │ 31.62 / 32.13 ±0.47 / 32.93 ms │                     31.63 / 32.38 ±1.07 / 34.51 ms │ no change │
│ QQuery 16 │ 14.16 / 14.46 ±0.23 / 14.75 ms │                     14.38 / 14.40 ±0.02 / 14.44 ms │ no change │
│ QQuery 17 │ 72.36 / 74.13 ±1.64 / 77.15 ms │                     72.48 / 73.79 ±1.71 / 77.18 ms │ no change │
│ QQuery 18 │ 58.97 / 60.31 ±0.90 / 61.43 ms │                     60.12 / 62.27 ±2.92 / 68.03 ms │ no change │
│ QQuery 19 │ 33.20 / 33.88 ±1.24 / 36.36 ms │                     33.24 / 33.52 ±0.27 / 34.04 ms │ no change │
│ QQuery 20 │ 31.85 / 32.14 ±0.24 / 32.54 ms │                     32.11 / 32.48 ±0.23 / 32.77 ms │ no change │
│ QQuery 21 │ 55.78 / 57.73 ±1.36 / 59.62 ms │                     54.55 / 55.93 ±0.95 / 57.10 ms │ no change │
│ QQuery 22 │ 14.37 / 14.47 ±0.09 / 14.58 ms │                     14.33 / 14.68 ±0.35 / 15.22 ms │ no change │
└───────────┴────────────────────────────────┴────────────────────────────────────────────────────┴───────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                                                 ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                                                 │ 765.83ms │
│ Total Time (feat_hash-join-dynamic-filter-with-range-partition)   │ 770.55ms │
│ Average Time (HEAD)                                               │  34.81ms │
│ Average Time (feat_hash-join-dynamic-filter-with-range-partition) │  35.03ms │
│ Queries Faster                                                    │        0 │
│ Queries Slower                                                    │        0 │
│ Queries with No Change                                            │       22 │
│ Queries with Failure                                              │        0 │
└───────────────────────────────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 520.3 MiB
CPU user 21.9s
CPU sys 1.7s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 518.6 MiB
CPU user 22.1s
CPU sys 1.9s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 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

Comparing HEAD and feat_hash-join-dynamic-filter-with-range-partition
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                  HEAD ┃ feat_hash-join-dynamic-filter-with-range-partition ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │           5.51 / 6.07 ±0.94 / 7.94 ms │                        5.59 / 6.23 ±0.94 / 8.10 ms │     no change │
│ QQuery 2  │        81.14 / 81.78 ±0.37 / 82.29 ms │                     81.45 / 81.86 ±0.30 / 82.32 ms │     no change │
│ QQuery 3  │        29.93 / 30.19 ±0.25 / 30.61 ms │                     29.70 / 30.07 ±0.27 / 30.53 ms │     no change │
│ QQuery 4  │     487.82 / 494.20 ±3.66 / 497.93 ms │                  491.52 / 495.68 ±2.76 / 499.99 ms │     no change │
│ QQuery 5  │        52.47 / 53.07 ±0.43 / 53.75 ms │                     52.79 / 53.00 ±0.27 / 53.53 ms │     no change │
│ QQuery 6  │        37.07 / 37.24 ±0.13 / 37.46 ms │                     36.96 / 37.33 ±0.20 / 37.51 ms │     no change │
│ QQuery 7  │        95.31 / 96.11 ±0.59 / 96.87 ms │                     95.07 / 95.55 ±0.54 / 96.55 ms │     no change │
│ QQuery 8  │        37.00 / 38.79 ±2.17 / 43.05 ms │                     37.45 / 38.63 ±1.86 / 42.33 ms │     no change │
│ QQuery 9  │        52.41 / 55.49 ±2.51 / 59.65 ms │                     52.25 / 54.92 ±1.94 / 58.16 ms │     no change │
│ QQuery 10 │        64.08 / 64.84 ±0.48 / 65.43 ms │                     63.56 / 64.56 ±0.73 / 65.68 ms │     no change │
│ QQuery 11 │     294.55 / 307.07 ±7.93 / 319.34 ms │                  302.48 / 306.35 ±2.96 / 311.64 ms │     no change │
│ QQuery 12 │        29.04 / 29.41 ±0.41 / 30.18 ms │                     29.05 / 29.36 ±0.24 / 29.76 ms │     no change │
│ QQuery 13 │     119.53 / 120.63 ±0.69 / 121.60 ms │                  119.20 / 120.63 ±1.21 / 122.63 ms │     no change │
│ QQuery 14 │     414.23 / 419.75 ±3.73 / 424.75 ms │                  415.52 / 420.16 ±2.46 / 422.27 ms │     no change │
│ QQuery 15 │        57.52 / 58.28 ±0.59 / 59.21 ms │                     57.38 / 58.67 ±0.82 / 59.90 ms │     no change │
│ QQuery 16 │           6.67 / 6.86 ±0.30 / 7.45 ms │                        6.67 / 6.81 ±0.20 / 7.18 ms │     no change │
│ QQuery 17 │        80.18 / 82.54 ±3.89 / 90.29 ms │                     80.26 / 81.06 ±0.85 / 82.67 ms │     no change │
│ QQuery 18 │     123.57 / 125.96 ±1.44 / 127.67 ms │                  124.61 / 125.42 ±0.45 / 126.00 ms │     no change │
│ QQuery 19 │        42.59 / 43.03 ±0.46 / 43.60 ms │                     42.52 / 42.70 ±0.20 / 43.04 ms │     no change │
│ QQuery 20 │        37.01 / 38.31 ±2.34 / 42.98 ms │                     36.23 / 36.89 ±0.44 / 37.48 ms │     no change │
│ QQuery 21 │        17.94 / 18.30 ±0.41 / 19.11 ms │                     18.03 / 18.16 ±0.12 / 18.39 ms │     no change │
│ QQuery 22 │        62.83 / 64.03 ±0.76 / 64.73 ms │                     63.31 / 63.92 ±0.71 / 65.04 ms │     no change │
│ QQuery 23 │     347.67 / 350.13 ±2.50 / 354.81 ms │                  346.14 / 349.21 ±5.04 / 359.19 ms │     no change │
│ QQuery 24 │     224.32 / 229.41 ±5.12 / 238.43 ms │                  224.68 / 229.64 ±4.92 / 238.05 ms │     no change │
│ QQuery 25 │     111.20 / 112.16 ±1.18 / 114.44 ms │                  111.30 / 111.67 ±0.35 / 112.27 ms │     no change │
│ QQuery 26 │        58.63 / 61.03 ±2.54 / 65.84 ms │                     57.85 / 59.84 ±2.69 / 65.10 ms │     no change │
│ QQuery 27 │           6.23 / 6.34 ±0.16 / 6.67 ms │                        6.36 / 6.49 ±0.16 / 6.81 ms │     no change │
│ QQuery 28 │        59.62 / 61.68 ±1.06 / 62.66 ms │                     57.22 / 61.10 ±2.00 / 62.91 ms │     no change │
│ QQuery 29 │      97.96 / 102.05 ±6.53 / 115.08 ms │                   97.32 / 100.19 ±2.52 / 104.53 ms │     no change │
│ QQuery 30 │        32.73 / 34.75 ±2.19 / 38.94 ms │                     33.90 / 34.90 ±0.61 / 35.49 ms │     no change │
│ QQuery 31 │     113.41 / 114.42 ±1.23 / 116.80 ms │                  112.64 / 113.62 ±0.77 / 114.87 ms │     no change │
│ QQuery 32 │        20.95 / 21.24 ±0.19 / 21.44 ms │                     20.96 / 21.07 ±0.09 / 21.20 ms │     no change │
│ QQuery 33 │        38.52 / 40.80 ±4.09 / 48.96 ms │                     38.46 / 39.00 ±0.53 / 39.98 ms │     no change │
│ QQuery 34 │         9.95 / 10.86 ±0.89 / 12.33 ms │                      9.81 / 10.90 ±0.96 / 12.38 ms │     no change │
│ QQuery 35 │        73.43 / 73.97 ±0.30 / 74.22 ms │                     72.98 / 74.53 ±0.93 / 75.90 ms │     no change │
│ QQuery 36 │           5.82 / 5.93 ±0.17 / 6.26 ms │                        5.93 / 6.07 ±0.18 / 6.42 ms │     no change │
│ QQuery 37 │           6.80 / 6.89 ±0.08 / 7.00 ms │                        6.89 / 6.96 ±0.07 / 7.05 ms │     no change │
│ QQuery 38 │        62.82 / 63.45 ±0.53 / 64.32 ms │                     61.95 / 62.55 ±0.36 / 62.99 ms │     no change │
│ QQuery 39 │        90.76 / 92.75 ±3.00 / 98.67 ms │                    91.68 / 95.28 ±3.75 / 101.50 ms │     no change │
│ QQuery 40 │        23.05 / 23.64 ±0.37 / 24.16 ms │                     23.20 / 23.60 ±0.46 / 24.42 ms │     no change │
│ QQuery 41 │        11.58 / 11.82 ±0.22 / 12.14 ms │                     11.59 / 11.84 ±0.19 / 12.17 ms │     no change │
│ QQuery 42 │        24.24 / 24.68 ±0.33 / 25.06 ms │                     24.07 / 24.46 ±0.52 / 25.46 ms │     no change │
│ QQuery 43 │           4.97 / 5.12 ±0.14 / 5.38 ms │                        5.05 / 5.16 ±0.13 / 5.41 ms │     no change │
│ QQuery 44 │           9.22 / 9.39 ±0.14 / 9.62 ms │                        9.37 / 9.52 ±0.13 / 9.73 ms │     no change │
│ QQuery 45 │        38.10 / 38.76 ±0.90 / 40.44 ms │                     39.05 / 39.30 ±0.28 / 39.76 ms │     no change │
│ QQuery 46 │        12.07 / 13.61 ±2.60 / 18.80 ms │                     11.91 / 12.27 ±0.39 / 12.96 ms │ +1.11x faster │
│ QQuery 47 │     230.01 / 233.90 ±3.72 / 240.16 ms │                  228.41 / 232.50 ±3.92 / 239.84 ms │     no change │
│ QQuery 48 │        96.51 / 97.31 ±0.80 / 98.73 ms │                     96.70 / 97.15 ±0.28 / 97.48 ms │     no change │
│ QQuery 49 │        77.19 / 79.61 ±3.52 / 86.53 ms │                     77.69 / 78.14 ±0.44 / 78.97 ms │     no change │
│ QQuery 50 │        60.19 / 61.29 ±0.89 / 62.88 ms │                     60.59 / 62.73 ±3.26 / 69.12 ms │     no change │
│ QQuery 51 │        93.41 / 94.66 ±0.78 / 95.81 ms │                     92.50 / 94.44 ±1.44 / 96.22 ms │     no change │
│ QQuery 52 │        24.43 / 26.32 ±2.94 / 32.18 ms │                     24.66 / 24.88 ±0.22 / 25.29 ms │ +1.06x faster │
│ QQuery 53 │        30.20 / 30.67 ±0.35 / 31.07 ms │                     30.24 / 32.37 ±3.33 / 38.99 ms │  1.06x slower │
│ QQuery 54 │        56.81 / 57.76 ±1.00 / 59.67 ms │                     56.15 / 57.12 ±1.02 / 59.07 ms │     no change │
│ QQuery 55 │        23.76 / 24.49 ±0.43 / 25.05 ms │                     23.68 / 24.04 ±0.42 / 24.85 ms │     no change │
│ QQuery 56 │        39.30 / 40.20 ±0.52 / 40.78 ms │                     39.23 / 40.23 ±0.54 / 40.80 ms │     no change │
│ QQuery 57 │     178.03 / 180.58 ±2.37 / 184.78 ms │                  179.53 / 180.85 ±0.94 / 182.21 ms │     no change │
│ QQuery 58 │     116.17 / 118.98 ±3.63 / 125.73 ms │                  117.10 / 119.00 ±1.10 / 120.28 ms │     no change │
│ QQuery 59 │     118.94 / 119.30 ±0.38 / 119.93 ms │                  118.85 / 119.70 ±0.75 / 121.02 ms │     no change │
│ QQuery 60 │        39.66 / 41.27 ±2.77 / 46.80 ms │                     39.91 / 40.36 ±0.38 / 41.01 ms │     no change │
│ QQuery 61 │        12.28 / 12.45 ±0.22 / 12.88 ms │                     12.49 / 12.72 ±0.17 / 13.00 ms │     no change │
│ QQuery 62 │        46.82 / 47.93 ±1.26 / 50.23 ms │                     47.53 / 49.36 ±2.11 / 52.88 ms │     no change │
│ QQuery 63 │        30.25 / 30.41 ±0.17 / 30.73 ms │                     30.34 / 31.19 ±0.49 / 31.67 ms │     no change │
│ QQuery 64 │     412.19 / 417.20 ±2.60 / 419.50 ms │                  409.35 / 416.20 ±3.76 / 420.77 ms │     no change │
│ QQuery 65 │     126.19 / 130.51 ±2.71 / 134.24 ms │                  126.67 / 129.43 ±2.10 / 132.27 ms │     no change │
│ QQuery 66 │        81.34 / 82.35 ±0.89 / 83.81 ms │                     82.08 / 83.03 ±0.98 / 84.55 ms │     no change │
│ QQuery 67 │     243.84 / 246.56 ±2.28 / 250.06 ms │                  242.08 / 248.06 ±6.49 / 260.27 ms │     no change │
│ QQuery 68 │        12.21 / 12.37 ±0.13 / 12.58 ms │                     12.07 / 12.23 ±0.14 / 12.43 ms │     no change │
│ QQuery 69 │        59.01 / 60.94 ±2.77 / 66.40 ms │                     58.68 / 61.14 ±2.90 / 64.70 ms │     no change │
│ QQuery 70 │     107.36 / 111.02 ±3.14 / 115.21 ms │                  107.33 / 110.29 ±3.10 / 116.30 ms │     no change │
│ QQuery 71 │        36.28 / 36.53 ±0.20 / 36.87 ms │                     36.28 / 36.55 ±0.32 / 37.14 ms │     no change │
│ QQuery 72 │ 2160.55 / 2203.03 ±42.09 / 2276.14 ms │              2134.71 / 2180.06 ±47.66 / 2254.03 ms │     no change │
│ QQuery 73 │         9.67 / 12.05 ±3.50 / 18.95 ms │                      9.75 / 10.03 ±0.23 / 10.36 ms │ +1.20x faster │
│ QQuery 74 │     171.62 / 175.99 ±3.63 / 182.61 ms │                  173.36 / 178.96 ±5.71 / 189.11 ms │     no change │
│ QQuery 75 │     148.75 / 151.01 ±1.31 / 152.35 ms │                  150.40 / 155.22 ±7.47 / 170.08 ms │     no change │
│ QQuery 76 │        35.97 / 36.20 ±0.18 / 36.52 ms │                     35.74 / 36.14 ±0.68 / 37.50 ms │     no change │
│ QQuery 77 │        62.26 / 64.29 ±2.80 / 69.84 ms │                     62.12 / 62.86 ±0.58 / 63.49 ms │     no change │
│ QQuery 78 │     199.89 / 202.38 ±1.72 / 204.26 ms │                  196.43 / 201.57 ±5.31 / 211.37 ms │     no change │
│ QQuery 79 │        68.13 / 69.96 ±2.94 / 75.81 ms │                     69.17 / 72.64 ±2.41 / 74.79 ms │     no change │
│ QQuery 80 │     100.26 / 102.87 ±2.44 / 107.10 ms │                  100.42 / 101.95 ±1.34 / 104.45 ms │     no change │
│ QQuery 81 │        26.33 / 26.74 ±0.27 / 27.06 ms │                     26.35 / 26.55 ±0.16 / 26.75 ms │     no change │
│ QQuery 82 │        16.95 / 17.76 ±0.63 / 18.79 ms │                     16.72 / 17.79 ±1.70 / 21.18 ms │     no change │
│ QQuery 83 │        41.05 / 41.34 ±0.27 / 41.76 ms │                     40.56 / 42.19 ±1.64 / 45.24 ms │     no change │
│ QQuery 84 │        30.27 / 31.02 ±0.74 / 32.30 ms │                     30.27 / 31.96 ±2.18 / 36.22 ms │     no change │
│ QQuery 85 │     107.70 / 110.23 ±2.66 / 115.18 ms │                  106.66 / 107.44 ±0.63 / 108.38 ms │     no change │
│ QQuery 86 │        25.96 / 26.73 ±0.90 / 28.43 ms │                     25.61 / 28.03 ±1.79 / 30.65 ms │     no change │
│ QQuery 87 │        63.13 / 64.81 ±1.53 / 67.60 ms │                     63.52 / 64.94 ±1.94 / 68.68 ms │     no change │
│ QQuery 88 │        64.07 / 64.76 ±0.52 / 65.56 ms │                     64.72 / 65.10 ±0.26 / 65.40 ms │     no change │
│ QQuery 89 │        37.04 / 38.31 ±1.92 / 42.14 ms │                     36.73 / 37.23 ±0.42 / 37.84 ms │     no change │
│ QQuery 90 │        17.24 / 17.91 ±0.85 / 19.48 ms │                     17.45 / 17.63 ±0.10 / 17.75 ms │     no change │
│ QQuery 91 │        46.22 / 46.49 ±0.19 / 46.76 ms │                     46.49 / 48.18 ±1.99 / 51.96 ms │     no change │
│ QQuery 92 │        29.79 / 30.30 ±0.51 / 31.08 ms │                     30.70 / 31.84 ±1.21 / 33.42 ms │  1.05x slower │
│ QQuery 93 │        50.10 / 51.27 ±0.95 / 52.68 ms │                     50.25 / 51.15 ±0.58 / 52.08 ms │     no change │
│ QQuery 94 │        38.58 / 39.83 ±1.53 / 42.78 ms │                     38.55 / 39.13 ±0.59 / 40.15 ms │     no change │
│ QQuery 95 │        81.37 / 82.63 ±1.01 / 84.17 ms │                     81.28 / 83.02 ±1.48 / 85.19 ms │     no change │
│ QQuery 96 │        24.44 / 24.81 ±0.25 / 25.10 ms │                     24.43 / 24.63 ±0.22 / 25.05 ms │     no change │
│ QQuery 97 │        47.02 / 47.75 ±0.55 / 48.37 ms │                     46.78 / 47.41 ±0.81 / 48.95 ms │     no change │
│ QQuery 98 │        43.03 / 44.77 ±2.59 / 49.87 ms │                     43.25 / 44.17 ±0.66 / 45.10 ms │     no change │
│ QQuery 99 │        71.40 / 72.09 ±0.84 / 73.65 ms │                     71.37 / 71.98 ±0.77 / 73.38 ms │     no change │
└───────────┴───────────────────────────────────────┴────────────────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                                 ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                                 │ 10078.79ms │
│ Total Time (feat_hash-join-dynamic-filter-with-range-partition)   │ 10050.64ms │
│ Average Time (HEAD)                                               │   101.81ms │
│ Average Time (feat_hash-join-dynamic-filter-with-range-partition) │   101.52ms │
│ Queries Faster                                                    │          3 │
│ Queries Slower                                                    │          2 │
│ Queries with No Change                                            │         94 │
│ Queries with Failure                                              │          0 │
└───────────────────────────────────────────────────────────────────┴────────────┘

Resource Usage

tpcds — base (merge-base)

Metric Value
Wall time 55.0s
Peak memory 2.3 GiB
Avg memory 1.5 GiB
CPU user 228.2s
CPU sys 6.3s
Peak spill 0 B

tpcds — branch

Metric Value
Wall time 55.0s
Peak memory 2.3 GiB
Avg memory 1.5 GiB
CPU user 226.9s
CPU sys 6.1s
Peak spill 0 B

File an issue against this benchmark runner

@peterxcli

Copy link
Copy Markdown
Member Author

run benchmark tpch tpcds

@comphead We’d need to enable range partitioning on the join inputs for the effect to show up.

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

make sense to me!
If it's not too much trouble, could you share some performance comparison benchmark results?

@peterxcli

Copy link
Copy Markdown
Member Author

make sense to me! If it's not too much trouble, could you share some performance comparison benchmark results?

this still need some additional plumbing to really work, but let me try to do that and run some benchmark

@gene-bordegaray

Copy link
Copy Markdown
Contributor

I believe there is much discussion going on around the future of dynamic filters here #23814 . I am unable to give PRs full attention this week but think syncing with @jayshrivastava will be very useful

@peterxcli
peterxcli force-pushed the feat/hash-join-dynamic-filter-with-range-partition branch from 9056b30 to bf4e6a1 Compare July 31, 2026 04:29
@adriangbot

Copy link
Copy Markdown

@adriangb

Copy link
Copy Markdown
Contributor

run benchmark tpch tpcds

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5139346178-1322-flkmd 6.12.85+ #1 SMP Mon May 11 08:17:35 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 feat/hash-join-dynamic-filter-with-range-partition (7d2589f) to 39d5064 (merge-base) diff

Run configuration
run benchmark tpch

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5139346178-1323-7kkcj 6.12.85+ #1 SMP Mon May 11 08:17:35 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 feat/hash-join-dynamic-filter-with-range-partition (7d2589f) to 39d5064 (merge-base) diff

Run configuration
run benchmark tpcds

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

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

Comparing feat/hash-join-dynamic-filter-with-range-partition (7d2589f) to 39d5064 (merge-base) diff

Run configuration
run benchmark tpch
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

Comparing HEAD and feat_hash-join-dynamic-filter-with-range-partition
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃ feat_hash-join-dynamic-filter-with-range-partition ┃    Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ QQuery 1  │ 38.07 / 38.79 ±1.10 / 40.98 ms │                     38.08 / 39.24 ±1.24 / 40.89 ms │ no change │
│ QQuery 2  │ 19.03 / 19.72 ±0.93 / 21.52 ms │                     19.01 / 19.96 ±1.10 / 21.68 ms │ no change │
│ QQuery 3  │ 30.56 / 32.27 ±1.35 / 33.91 ms │                     30.97 / 32.95 ±1.77 / 35.72 ms │ no change │
│ QQuery 4  │ 17.44 / 18.20 ±1.20 / 20.58 ms │                     17.31 / 17.49 ±0.12 / 17.67 ms │ no change │
│ QQuery 5  │ 37.06 / 39.71 ±2.52 / 44.01 ms │                     37.58 / 40.04 ±1.60 / 42.52 ms │ no change │
│ QQuery 6  │ 16.12 / 16.87 ±1.02 / 18.88 ms │                     16.14 / 16.27 ±0.10 / 16.46 ms │ no change │
│ QQuery 7  │ 43.53 / 45.16 ±1.03 / 46.38 ms │                     42.33 / 44.22 ±1.74 / 47.35 ms │ no change │
│ QQuery 8  │ 42.39 / 43.30 ±0.69 / 44.30 ms │                     42.35 / 42.48 ±0.15 / 42.71 ms │ no change │
│ QQuery 9  │ 48.22 / 49.61 ±1.05 / 50.96 ms │                     48.96 / 49.82 ±1.37 / 52.55 ms │ no change │
│ QQuery 10 │ 41.84 / 42.41 ±0.46 / 43.05 ms │                     42.05 / 42.57 ±0.52 / 43.48 ms │ no change │
│ QQuery 11 │ 13.17 / 13.34 ±0.10 / 13.48 ms │                     13.13 / 13.25 ±0.10 / 13.38 ms │ no change │
│ QQuery 12 │ 23.55 / 24.24 ±0.41 / 24.65 ms │                     24.70 / 25.08 ±0.31 / 25.55 ms │ no change │
│ QQuery 13 │ 31.55 / 33.39 ±1.45 / 35.85 ms │                     32.46 / 33.69 ±1.21 / 35.72 ms │ no change │
│ QQuery 14 │ 23.24 / 23.40 ±0.14 / 23.62 ms │                     23.37 / 24.03 ±0.99 / 25.99 ms │ no change │
│ QQuery 15 │ 31.31 / 32.04 ±0.67 / 33.24 ms │                     30.68 / 31.26 ±0.62 / 32.38 ms │ no change │
│ QQuery 16 │ 13.77 / 14.01 ±0.24 / 14.33 ms │                     13.59 / 13.88 ±0.17 / 14.07 ms │ no change │
│ QQuery 17 │ 69.84 / 70.44 ±0.69 / 71.31 ms │                     69.23 / 70.88 ±1.59 / 73.60 ms │ no change │
│ QQuery 18 │ 57.49 / 58.81 ±1.05 / 60.61 ms │                     58.12 / 58.89 ±0.75 / 60.22 ms │ no change │
│ QQuery 19 │ 32.93 / 33.18 ±0.18 / 33.44 ms │                     33.00 / 33.59 ±0.49 / 34.20 ms │ no change │
│ QQuery 20 │ 31.39 / 32.08 ±0.79 / 33.55 ms │                     31.32 / 31.55 ±0.16 / 31.76 ms │ no change │
│ QQuery 21 │ 55.28 / 56.88 ±0.82 / 57.57 ms │                     53.58 / 54.70 ±1.00 / 56.58 ms │ no change │
│ QQuery 22 │ 13.81 / 13.91 ±0.08 / 14.04 ms │                     13.53 / 13.86 ±0.24 / 14.19 ms │ no change │
└───────────┴────────────────────────────────┴────────────────────────────────────────────────────┴───────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                                                 ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                                                 │ 751.78ms │
│ Total Time (feat_hash-join-dynamic-filter-with-range-partition)   │ 749.68ms │
│ Average Time (HEAD)                                               │  34.17ms │
│ Average Time (feat_hash-join-dynamic-filter-with-range-partition) │  34.08ms │
│ Queries Faster                                                    │        0 │
│ Queries Slower                                                    │        0 │
│ Queries with No Change                                            │       22 │
│ Queries with Failure                                              │        0 │
└───────────────────────────────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.3 GiB
Avg memory 532.6 MiB
CPU user 21.4s
CPU sys 1.7s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.2 GiB
Avg memory 523.2 MiB
CPU user 21.4s
CPU sys 1.6s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

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

Comparing feat/hash-join-dynamic-filter-with-range-partition (7d2589f) to 39d5064 (merge-base) diff

Run configuration
run benchmark tpcds
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

Comparing HEAD and feat_hash-join-dynamic-filter-with-range-partition
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                  HEAD ┃ feat_hash-join-dynamic-filter-with-range-partition ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │           5.38 / 5.88 ±0.86 / 7.60 ms │                        5.92 / 6.39 ±0.86 / 8.11 ms │  1.09x slower │
│ QQuery 2  │        79.78 / 80.10 ±0.36 / 80.77 ms │                     82.53 / 83.15 ±0.45 / 83.65 ms │     no change │
│ QQuery 3  │        29.22 / 29.53 ±0.25 / 29.87 ms │                     31.16 / 31.55 ±0.27 / 31.90 ms │  1.07x slower │
│ QQuery 4  │    481.19 / 493.04 ±21.90 / 536.81 ms │                 491.54 / 564.52 ±38.17 / 594.01 ms │  1.14x slower │
│ QQuery 5  │        53.57 / 54.03 ±0.45 / 54.87 ms │                     51.49 / 52.97 ±0.83 / 53.84 ms │     no change │
│ QQuery 6  │        38.70 / 38.98 ±0.24 / 39.34 ms │                     37.96 / 38.34 ±0.33 / 38.95 ms │     no change │
│ QQuery 7  │        94.83 / 95.96 ±1.02 / 97.19 ms │                    96.18 / 98.75 ±3.37 / 105.31 ms │     no change │
│ QQuery 8  │        36.88 / 38.78 ±2.62 / 43.89 ms │                     36.70 / 36.79 ±0.07 / 36.87 ms │ +1.05x faster │
│ QQuery 9  │        51.69 / 53.13 ±1.03 / 54.66 ms │                     51.68 / 53.02 ±1.35 / 54.69 ms │     no change │
│ QQuery 10 │        63.57 / 64.24 ±0.58 / 65.29 ms │                     63.36 / 65.14 ±1.76 / 68.46 ms │     no change │
│ QQuery 11 │     307.55 / 316.53 ±6.24 / 325.29 ms │                  294.63 / 301.96 ±4.76 / 308.64 ms │     no change │
│ QQuery 12 │        29.02 / 29.26 ±0.25 / 29.63 ms │                     28.91 / 29.21 ±0.17 / 29.35 ms │     no change │
│ QQuery 13 │     119.19 / 122.95 ±2.39 / 125.18 ms │                  119.91 / 121.73 ±1.10 / 123.04 ms │     no change │
│ QQuery 14 │     418.92 / 430.15 ±6.32 / 436.57 ms │                  414.92 / 420.05 ±3.62 / 425.08 ms │     no change │
│ QQuery 15 │        57.58 / 60.89 ±3.34 / 65.12 ms │                     57.91 / 60.44 ±3.11 / 66.40 ms │     no change │
│ QQuery 16 │           6.56 / 6.74 ±0.21 / 7.13 ms │                        6.65 / 6.89 ±0.20 / 7.25 ms │     no change │
│ QQuery 17 │        79.57 / 80.62 ±1.31 / 83.20 ms │                     81.56 / 83.85 ±2.94 / 89.02 ms │     no change │
│ QQuery 18 │     121.98 / 123.30 ±0.80 / 124.15 ms │                  124.61 / 126.63 ±1.30 / 128.31 ms │     no change │
│ QQuery 19 │        41.97 / 42.11 ±0.14 / 42.34 ms │                     42.34 / 42.55 ±0.28 / 43.11 ms │     no change │
│ QQuery 20 │        35.96 / 36.68 ±0.48 / 37.26 ms │                     35.68 / 37.54 ±1.72 / 40.50 ms │     no change │
│ QQuery 21 │        17.63 / 18.04 ±0.63 / 19.30 ms │                     17.71 / 18.04 ±0.48 / 18.98 ms │     no change │
│ QQuery 22 │        61.96 / 63.00 ±0.85 / 63.96 ms │                     62.80 / 63.93 ±0.78 / 64.90 ms │     no change │
│ QQuery 23 │     342.09 / 345.28 ±2.97 / 350.16 ms │                 352.02 / 397.48 ±23.79 / 417.98 ms │  1.15x slower │
│ QQuery 24 │     223.75 / 227.15 ±3.27 / 233.06 ms │                  229.48 / 235.84 ±6.05 / 246.31 ms │     no change │
│ QQuery 25 │     109.44 / 110.54 ±0.67 / 111.27 ms │                  112.51 / 116.51 ±6.71 / 129.88 ms │  1.05x slower │
│ QQuery 26 │        57.53 / 59.51 ±2.10 / 63.50 ms │                     59.29 / 59.52 ±0.18 / 59.71 ms │     no change │
│ QQuery 27 │           6.15 / 6.24 ±0.15 / 6.54 ms │                        6.10 / 6.27 ±0.18 / 6.60 ms │     no change │
│ QQuery 28 │        60.83 / 61.89 ±0.84 / 63.18 ms │                     57.85 / 60.92 ±1.62 / 62.61 ms │     no change │
│ QQuery 29 │       96.75 / 99.10 ±3.27 / 105.52 ms │                    98.25 / 99.24 ±0.72 / 100.29 ms │     no change │
│ QQuery 30 │        32.49 / 32.93 ±0.33 / 33.40 ms │                     32.49 / 32.72 ±0.13 / 32.88 ms │     no change │
│ QQuery 31 │     110.95 / 111.44 ±0.40 / 111.97 ms │                  111.52 / 113.69 ±2.70 / 119.01 ms │     no change │
│ QQuery 32 │        19.99 / 20.44 ±0.33 / 20.84 ms │                     20.35 / 20.65 ±0.27 / 21.14 ms │     no change │
│ QQuery 33 │        37.28 / 38.74 ±1.94 / 42.51 ms │                     37.22 / 37.79 ±0.33 / 38.05 ms │     no change │
│ QQuery 34 │          9.61 / 9.92 ±0.54 / 11.00 ms │                      9.68 / 10.16 ±0.47 / 11.00 ms │     no change │
│ QQuery 35 │        72.24 / 72.98 ±0.51 / 73.51 ms │                     73.00 / 73.34 ±0.26 / 73.66 ms │     no change │
│ QQuery 36 │           5.62 / 5.76 ±0.18 / 6.11 ms │                        5.74 / 6.04 ±0.41 / 6.85 ms │     no change │
│ QQuery 37 │           6.68 / 6.81 ±0.09 / 6.94 ms │                        6.76 / 6.84 ±0.07 / 6.93 ms │     no change │
│ QQuery 38 │        61.40 / 61.64 ±0.34 / 62.30 ms │                     61.74 / 63.25 ±2.30 / 67.80 ms │     no change │
│ QQuery 39 │        89.05 / 91.95 ±3.90 / 99.68 ms │                     90.39 / 90.70 ±0.32 / 91.30 ms │     no change │
│ QQuery 40 │        23.02 / 23.34 ±0.25 / 23.74 ms │                     23.33 / 23.45 ±0.14 / 23.72 ms │     no change │
│ QQuery 41 │        11.39 / 11.59 ±0.18 / 11.81 ms │                     11.45 / 11.69 ±0.27 / 12.03 ms │     no change │
│ QQuery 42 │        23.79 / 24.09 ±0.26 / 24.43 ms │                     24.05 / 24.25 ±0.23 / 24.68 ms │     no change │
│ QQuery 43 │           4.89 / 4.98 ±0.11 / 5.18 ms │                        4.94 / 5.07 ±0.15 / 5.37 ms │     no change │
│ QQuery 44 │           9.05 / 9.16 ±0.09 / 9.31 ms │                        9.19 / 9.26 ±0.05 / 9.32 ms │     no change │
│ QQuery 45 │        37.25 / 37.90 ±0.42 / 38.46 ms │                     38.58 / 41.05 ±3.35 / 47.68 ms │  1.08x slower │
│ QQuery 46 │        11.56 / 11.74 ±0.15 / 11.96 ms │                     11.94 / 12.47 ±0.35 / 12.97 ms │  1.06x slower │
│ QQuery 47 │    227.17 / 260.87 ±26.58 / 293.14 ms │                  233.58 / 239.63 ±4.85 / 247.82 ms │ +1.09x faster │
│ QQuery 48 │     103.27 / 103.60 ±0.41 / 104.39 ms │                   97.20 / 102.77 ±5.77 / 110.74 ms │     no change │
│ QQuery 49 │        77.40 / 82.08 ±4.57 / 90.45 ms │                     76.36 / 78.10 ±2.13 / 82.21 ms │     no change │
│ QQuery 50 │        59.41 / 60.71 ±1.24 / 62.93 ms │                     59.41 / 60.03 ±0.41 / 60.54 ms │     no change │
│ QQuery 51 │        92.12 / 93.14 ±0.87 / 94.24 ms │                     90.43 / 93.94 ±3.16 / 99.46 ms │     no change │
│ QQuery 52 │        24.36 / 26.88 ±3.70 / 34.22 ms │                     24.04 / 24.45 ±0.36 / 24.87 ms │ +1.10x faster │
│ QQuery 53 │        29.03 / 29.84 ±0.61 / 30.88 ms │                     29.40 / 29.65 ±0.19 / 29.88 ms │     no change │
│ QQuery 54 │        55.27 / 55.47 ±0.27 / 56.00 ms │                     55.10 / 58.69 ±2.03 / 60.45 ms │  1.06x slower │
│ QQuery 55 │        23.18 / 23.61 ±0.27 / 24.00 ms │                     25.73 / 26.65 ±0.61 / 27.40 ms │  1.13x slower │
│ QQuery 56 │        39.27 / 39.52 ±0.25 / 39.84 ms │                     39.34 / 42.11 ±2.39 / 45.17 ms │  1.07x slower │
│ QQuery 57 │     174.72 / 176.81 ±2.38 / 181.47 ms │                  176.86 / 178.48 ±1.60 / 181.41 ms │     no change │
│ QQuery 58 │     114.44 / 115.13 ±0.74 / 116.53 ms │                  114.53 / 115.93 ±1.04 / 117.63 ms │     no change │
│ QQuery 59 │     117.52 / 117.90 ±0.33 / 118.47 ms │                  117.56 / 122.98 ±4.58 / 130.58 ms │     no change │
│ QQuery 60 │        39.43 / 41.49 ±3.00 / 47.44 ms │                     43.63 / 44.44 ±0.67 / 45.40 ms │  1.07x slower │
│ QQuery 61 │        12.04 / 12.23 ±0.26 / 12.75 ms │                     13.80 / 13.96 ±0.16 / 14.20 ms │  1.14x slower │
│ QQuery 62 │        46.82 / 47.96 ±0.63 / 48.63 ms │                     51.55 / 51.75 ±0.20 / 52.08 ms │  1.08x slower │
│ QQuery 63 │        29.79 / 30.34 ±0.41 / 30.98 ms │                     31.65 / 32.30 ±0.59 / 33.37 ms │  1.06x slower │
│ QQuery 64 │     407.57 / 411.31 ±2.88 / 415.60 ms │                 411.20 / 424.13 ±16.68 / 455.17 ms │     no change │
│ QQuery 65 │     123.57 / 126.90 ±2.85 / 131.92 ms │                  124.61 / 127.69 ±2.78 / 131.41 ms │     no change │
│ QQuery 66 │        83.11 / 83.99 ±0.46 / 84.42 ms │                     80.26 / 81.42 ±0.67 / 81.94 ms │     no change │
│ QQuery 67 │    252.84 / 282.38 ±14.84 / 292.26 ms │                  241.95 / 248.86 ±7.01 / 261.57 ms │ +1.13x faster │
│ QQuery 68 │        12.35 / 15.20 ±4.67 / 24.53 ms │                     11.87 / 12.11 ±0.22 / 12.48 ms │ +1.26x faster │
│ QQuery 69 │        57.52 / 58.25 ±0.73 / 59.60 ms │                     58.10 / 58.74 ±0.49 / 59.40 ms │     no change │
│ QQuery 70 │     105.95 / 110.45 ±3.39 / 116.29 ms │                  105.38 / 110.96 ±6.41 / 123.22 ms │     no change │
│ QQuery 71 │        35.11 / 37.43 ±3.71 / 44.82 ms │                     35.57 / 36.30 ±0.53 / 37.03 ms │     no change │
│ QQuery 72 │ 2143.75 / 2248.95 ±90.11 / 2369.17 ms │             2116.87 / 2271.38 ±122.23 / 2492.57 ms │     no change │
│ QQuery 73 │          9.52 / 9.73 ±0.27 / 10.25 ms │                     10.25 / 10.42 ±0.16 / 10.62 ms │  1.07x slower │
│ QQuery 74 │     168.56 / 170.60 ±1.38 / 172.53 ms │                  171.91 / 176.06 ±3.63 / 181.81 ms │     no change │
│ QQuery 75 │     148.84 / 150.43 ±1.76 / 153.20 ms │                  150.01 / 153.82 ±4.27 / 162.09 ms │     no change │
│ QQuery 76 │        35.61 / 36.92 ±1.28 / 39.23 ms │                     35.46 / 36.14 ±0.83 / 37.77 ms │     no change │
│ QQuery 77 │        60.76 / 61.56 ±0.65 / 62.62 ms │                     61.31 / 62.47 ±1.60 / 65.54 ms │     no change │
│ QQuery 78 │     196.76 / 199.65 ±2.27 / 203.40 ms │                  200.18 / 202.63 ±2.20 / 206.49 ms │     no change │
│ QQuery 79 │        67.16 / 67.54 ±0.41 / 68.28 ms │                     67.62 / 68.97 ±1.04 / 70.58 ms │     no change │
│ QQuery 80 │      99.89 / 101.70 ±2.03 / 104.50 ms │                   99.96 / 101.59 ±1.24 / 103.21 ms │     no change │
│ QQuery 81 │        25.53 / 25.79 ±0.29 / 26.32 ms │                     26.08 / 27.24 ±1.30 / 29.76 ms │  1.06x slower │
│ QQuery 82 │        16.18 / 16.48 ±0.35 / 17.16 ms │                     16.99 / 17.20 ±0.16 / 17.47 ms │     no change │
│ QQuery 83 │        39.39 / 40.75 ±2.60 / 45.95 ms │                     40.00 / 43.37 ±5.02 / 53.31 ms │  1.06x slower │
│ QQuery 84 │        29.88 / 30.03 ±0.09 / 30.12 ms │                     30.84 / 31.53 ±0.47 / 32.27 ms │     no change │
│ QQuery 85 │     104.95 / 107.43 ±1.89 / 109.84 ms │                  107.78 / 108.71 ±0.78 / 110.11 ms │     no change │
│ QQuery 86 │        24.63 / 25.13 ±0.35 / 25.66 ms │                     25.65 / 25.93 ±0.26 / 26.32 ms │     no change │
│ QQuery 87 │        61.17 / 61.57 ±0.50 / 62.53 ms │                     62.37 / 64.87 ±3.65 / 71.94 ms │  1.05x slower │
│ QQuery 88 │        62.50 / 64.74 ±3.74 / 72.19 ms │                     63.53 / 63.80 ±0.24 / 64.21 ms │     no change │
│ QQuery 89 │        35.71 / 36.28 ±0.40 / 36.96 ms │                     36.25 / 36.86 ±0.48 / 37.61 ms │     no change │
│ QQuery 90 │        16.71 / 16.90 ±0.18 / 17.22 ms │                     17.12 / 17.35 ±0.15 / 17.59 ms │     no change │
│ QQuery 91 │        45.67 / 46.05 ±0.37 / 46.73 ms │                     47.10 / 48.54 ±1.99 / 52.46 ms │  1.05x slower │
│ QQuery 92 │        28.86 / 29.54 ±0.55 / 30.20 ms │                     30.20 / 31.00 ±0.71 / 32.26 ms │     no change │
│ QQuery 93 │        50.07 / 51.31 ±1.20 / 53.36 ms │                     50.04 / 51.71 ±0.91 / 52.71 ms │     no change │
│ QQuery 94 │        38.63 / 39.73 ±0.97 / 41.23 ms │                     38.55 / 38.94 ±0.24 / 39.22 ms │     no change │
│ QQuery 95 │        80.11 / 81.24 ±0.71 / 82.05 ms │                     81.25 / 83.45 ±2.51 / 88.17 ms │     no change │
│ QQuery 96 │        24.02 / 24.23 ±0.32 / 24.88 ms │                     24.48 / 24.76 ±0.19 / 25.02 ms │     no change │
│ QQuery 97 │        46.67 / 48.00 ±1.91 / 51.81 ms │                     47.02 / 47.81 ±0.67 / 49.03 ms │     no change │
│ QQuery 98 │        42.44 / 43.33 ±0.50 / 43.93 ms │                     43.43 / 44.26 ±0.55 / 44.79 ms │     no change │
│ QQuery 99 │        71.64 / 73.30 ±1.00 / 74.61 ms │                     71.34 / 73.22 ±3.03 / 79.24 ms │     no change │
└───────────┴───────────────────────────────────────┴────────────────────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                                                 ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                                                 │ 10121.45ms │
│ Total Time (feat_hash-join-dynamic-filter-with-range-partition)   │ 10281.75ms │
│ Average Time (HEAD)                                               │   102.24ms │
│ Average Time (feat_hash-join-dynamic-filter-with-range-partition) │   103.86ms │
│ Queries Faster                                                    │          5 │
│ Queries Slower                                                    │         19 │
│ Queries with No Change                                            │         75 │
│ Queries with Failure                                              │          0 │
└───────────────────────────────────────────────────────────────────┴────────────┘

Resource Usage

tpcds — base (merge-base)

Metric Value
Wall time 55.0s
Peak memory 2.2 GiB
Avg memory 1.5 GiB
CPU user 225.3s
CPU sys 6.2s
Peak spill 0 B

tpcds — branch

Metric Value
Wall time 55.0s
Peak memory 2.2 GiB
Avg memory 1.5 GiB
CPU user 227.3s
CPU sys 6.4s
Peak spill 0 B

File an issue against this benchmark runner

@peterxcli

Copy link
Copy Markdown
Member Author

Sure, I will address your review in few hours.

@alamb

alamb commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Thanks -- I think by early next week also fine -- @timsaucer is hoping to make a RC mid next week

@peterxcli
peterxcli marked this pull request as draft August 8, 2026 21:44
@github-actions github-actions Bot added the sqllogictest SQL Logic Tests (.slt) label Aug 8, 2026

@peterxcli peterxcli left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

@gene-bordegaray thanks for the review.
There are two inline comments that I didn't resolve. I think we need more discussion around "edge case that is comparing floating point 0.0 values" especially.


#[tokio::test]
async fn test_hashjoin_dynamic_filter_pushdown_range_partitioned() {
use datafusion_common::JoinType;

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I followed how test_hashjoin_hash_table_pushdown_partitioned's pattern

use datafusion_common::JoinType;
use datafusion_physical_plan::joins::{HashJoinExec, PartitionMode};

it also import the similar things at the top of test function.

should I also move their use to module level, or just follow their convention?

.iter()
.zip(partition_filters)
.map(|(split_point, then_expr)| {
let when_expr = build_lexicographic_filter(

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

IMO, because now we're using CASE WHEN expression to do the partition routing, so I'm not sure that 1:1 replicate from

/// This function compares two tuples depending on the given sort options.
pub fn compare_rows(
x: &[ScalarValue],
y: &[ScalarValue],
sort_options: &[SortOptions],
) -> Result<Ordering> {
let zip_it = x.iter().zip(y.iter()).zip(sort_options.iter());
// Preserving lexical ordering.
for ((lhs, rhs), sort_options) in zip_it {
// Consider all combinations of NULLS FIRST/LAST and ASC/DESC configurations.
let result = match (lhs.is_null(), rhs.is_null(), sort_options.nulls_first) {
(true, false, false) | (false, true, true) => Ordering::Greater,
(true, false, true) | (false, true, false) => Ordering::Less,
(false, false, _) => {
if sort_options.descending {
rhs.try_cmp(lhs)?
} else {
lhs.try_cmp(rhs)?
}
}
(true, true, _) => continue,
};
if result != Ordering::Equal {
return Ok(result);
}
}
Ok(Ordering::Equal)
}
is practical.
Maybe we should just reject this case in
fn allow_join_dynamic_filter_pushdown(&self, config: &ConfigOptions) -> bool {


#[tokio::test]
async fn test_hashjoin_dynamic_filter_pushdown_range_partitioned() {
use datafusion_common::JoinType;

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.

since it seems we are repeating imports, would probably be good to add these to module level, thaknk you 🙇

);
}

fn hashjoin_pushdown_scans() -> (

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.

really great thank you ❤️

.iter()
.zip(partition_filters)
.map(|(split_point, then_expr)| {
let when_expr = build_lexicographic_filter(

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.

Well I think we can achieve this if we redesign the statement a bit.

Right now we do:

CASE
  WHEN key <range split[0] THEN F0
  WHEN key <range split[1] THEN F1
  ...
  ELSE Fn
END

and the floating point comparisns here are cuasing us to suffer.

Range partitioning guarentees that a row will be routed to a particular partition number based on the split points and the row values itself. So we can modify this statement to reflect that rather that comparing floating points directly in the case, with someting like this:

CASE range_partition(key)
  WHEN 0 THEN F0
  WHEN 1 THEN F1
  ...
  ELSE Fn
END

We can extract the code that determines where a row will fall form the repartition code into a comon helper:
https://github.com/peterxcli/datafusion/blob/18f9db399331ef1c2163c8d5a230b7169d073e50/datafusion/physical-plan/src/repartition/mod.rs#L974-L992

Then we can use something similar to what the Hash case is doing with HashExpr here by adding a RangeExpr that will return the partition rows belong in. Then both the repartition and this code can call it to ensure behavior is the same.

I don't believe this will have any pruning regression from the prior form since the page-stats pruner doesnt understand CASE statements at all.

For CPU overhead we now have to extract a ScalarValue per key in every row but this was something we did in the repartitioner knowing we can improve in later iterations as benchmarks showed proof of needing better perf here. We can file an issue to benchmark this and samply it to find where / how we can improve. One idea is to turn the keys into Arrow arrays and do this once per batch.

@jayshrivastava @LiaCastaneda also lmk what you guys this

@timsaucer

Copy link
Copy Markdown
Member

I am hoping to start the release branch on Wednesday. I see this was moved to draft. Do you think it will be ready for 55.0.0 or should we expect to ship without it? There is a lot of good discussion in this PR and I haven't followed all of it in detail, so it would be helpful to me to get a feel for how close this is to ready.

@gene-bordegaray

Copy link
Copy Markdown
Contributor

I am hoping to start the release branch on Wednesday. I see this was moved to draft. Do you think it will be ready for 55.0.0 or should we expect to ship without it? There is a lot of good discussion in this PR and I haven't followed all of it in detail, so it would be helpful to me to get a feel for how close this is to ready.

@timsaucer Hey tim! I think it is actually quite close. There is only one real discssuion thread goihg on here about how we can change the case statement to ensure the dyn filter handles comparing rows the same as the repartitioner here: #23854 (comment) I think this shouldnt be a large refactor so I think it should be in by Wednesday 👍

@peterxcli lmk thoughts as well 😄

@peterxcli
peterxcli marked this pull request as ready for review August 10, 2026 15:06
@github-actions github-actions Bot added the proto Related to proto crate label Aug 10, 2026
@peterxcli

peterxcli commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

Gene’s review identified that the searched dynamic-filter CASE used BinaryExpr comparisons whose semantics do not exactly match the Range repartitioner’s compare_rows semantics. 8903354 fixes that issue by introducing RangeExpr and sharing the partition-ID implementation between Range repartitioning and dynamic-filter routing.

While investigating signed zero, found a separate pre-existing issue: Range ordering can place two HashJoin-equal keys, such as -0.0 and +0.0, into different partitions. This affects partitioned HashJoin even without dynamic filtering and is therefore outside the scope of the RangeExpr change. A general follow-up should make Range routing operate on canonicalized equi-join keys, likely using a shared canonicalizer and RowConverter, so equality always implies partition co-location.

cc @gene-bordegaray @jayshrivastava

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown

Thank you for opening this pull request!

Reviewer note: cargo-semver-checks reported the current version number is not SemVer-compatible with the changes in this pull request (compared against the base branch).

Details
     Cloning apache/main
    Building datafusion v54.1.0 (current)
       Built [ 106.474s] (current)
     Parsing datafusion v54.1.0 (current)
      Parsed [   0.034s] (current)
    Building datafusion v54.1.0 (baseline)
       Built [ 103.933s] (baseline)
     Parsing datafusion v54.1.0 (baseline)
      Parsed [   0.034s] (baseline)
    Checking datafusion v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.650s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [ 212.980s] datafusion
    Building datafusion-physical-plan v54.1.0 (current)
       Built [  37.509s] (current)
     Parsing datafusion-physical-plan v54.1.0 (current)
      Parsed [   0.142s] (current)
    Building datafusion-physical-plan v54.1.0 (baseline)
       Built [  37.681s] (baseline)
     Parsing datafusion-physical-plan v54.1.0 (baseline)
      Parsed [   0.141s] (baseline)
    Checking datafusion-physical-plan v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.604s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [  77.540s] datafusion-physical-plan
    Building datafusion-proto v54.1.0 (current)
       Built [  61.765s] (current)
     Parsing datafusion-proto v54.1.0 (current)
      Parsed [   0.018s] (current)
    Building datafusion-proto v54.1.0 (baseline)
       Built [  61.511s] (baseline)
     Parsing datafusion-proto v54.1.0 (baseline)
      Parsed [   0.020s] (baseline)
    Checking datafusion-proto v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.244s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [ 124.856s] datafusion-proto
    Building datafusion-proto-models v54.1.0 (current)
       Built [  25.175s] (current)
     Parsing datafusion-proto-models v54.1.0 (current)
      Parsed [   0.126s] (current)
    Building datafusion-proto-models v54.1.0 (baseline)
       Built [  25.114s] (baseline)
     Parsing datafusion-proto-models v54.1.0 (baseline)
      Parsed [   0.129s] (baseline)
    Checking datafusion-proto-models v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   1.648s] 223 checks: 222 pass, 1 fail, 0 warn, 30 skip

--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.49.0/src/lints/enum_variant_added.ron

Failed in:
  variant ExprType:RangeExpr in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:1624
  variant ExprType:RangeExpr in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:1624

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  53.380s] datafusion-proto-models
    Building datafusion-sqllogictest v54.1.0 (current)
       Built [ 182.479s] (current)
     Parsing datafusion-sqllogictest v54.1.0 (current)
      Parsed [   0.021s] (current)
    Building datafusion-sqllogictest v54.1.0 (baseline)
       Built [ 182.218s] (baseline)
     Parsing datafusion-sqllogictest v54.1.0 (baseline)
      Parsed [   0.022s] (baseline)
    Checking datafusion-sqllogictest v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.085s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [ 367.627s] datafusion-sqllogictest

@github-actions github-actions Bot added the auto detected api change Auto detected API change label Aug 10, 2026

@gene-bordegaray gene-bordegaray 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.

Great work! Thank you 🚀
this is looking good and really close to good. No correctness blockers, just think we can clean up the diff and tighten some tests then this should be good to go 👍

Comment thread datafusion/physical-plan/src/ordering.rs Outdated
Comment thread datafusion/physical-plan/src/repartition/mod.rs Outdated
Comment thread datafusion/physical-plan/src/joins/hash_join/shared_bounds.rs Outdated
/// This uses the same routing function as [`BatchPartitioner`], so dynamic
/// filtering and repartitioning agree for every [`ScalarValue`] comparison.
#[derive(Debug, Hash, PartialEq, Eq)]
pub struct RangeExpr {

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 a grat implementation. Thank you!

this file is growing quite large. maybe we make a follow up to break some of this up a bit 👍

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

filed #24245

expr.with_new_children(vec![Arc::clone(&remapped), Arc::clone(&remapped)])?;

let children = rewritten.children();
assert_eq!(children.len(), 2);

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.

we are only checking that the children exist here, could we check the range and sort properties as well

like the sort options, split points

Comment thread datafusion/physical-plan/src/repartition/mod.rs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto detected api change Auto detected API change core Core DataFusion crate physical-plan Changes to the physical-plan crate proto Related to proto crate sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support dynamic filters for range co-partitioned joins