Repository navigation
fix: split BoundedWindowAggExec output into batch_size batches - #26974
Merged
comphead merged 3 commits intoNov 3, 2026
Merged
Conversation
`BoundedWindowAggExec` emitted every row that became final in one batch, so frames that need later rows could exceed `batch_size`. Wrap its stream in `BatchSplitStream` and `ObservedStream`, as `UnnestExec` does, so the output is sliced into batches of at most `batch_size` rows and `output_batches` counts the slices. Closes apache#26959.
2010YOUY01
reviewed
Nov 1, 2026
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Nov 3, 2026
This was referenced Nov 3, 2026
Closed
Phoenix500526
pushed a commit
to Phoenix500526/datafusion
that referenced
this pull request
Nov 3, 2026
…sh_collisions (apache#27034) ## Which issue does this PR close? - Closes apache#27033. ## Rationale for this change `completed_groups_release_first_value_bitmap` (added in apache#26782) takes about 10 minutes in the `cargo test hash collisions (amd64)` merge-queue job. It aggregates 131,072 distinct keys in one batch. Under `force_hash_collisions`, every key has the hash 0, so the aggregate is quadratic. The test checks that `FIRST_VALUE(v ORDER BY v)` releases its per-batch bitmap, which does not depend on hashing. The long job gives spot runner shutdowns more time to hit it. Evidence from merge-queue runs: - In the passing rerun for apache#26926 ([job](https://github.com/apache/datafusion/actions/runs/41571721394/job/125710730373)), the physical-plan unit test binary took 609.89s. All other tests in it finished by 03:40:31. This test ran from about 03:40:07 to 03:50:17. - The median job time went from 6.2 minutes (230 jobs, Oct 21 to Oct 30) to 12.0 minutes (70 jobs after apache#26782 merged). - All 5 failed attempts of the job since then were runner shutdowns while this test was running: apache#26929 ([job](https://github.com/apache/datafusion/actions/runs/41114163010/job/124263887540)), apache#26898 ([job](https://github.com/apache/datafusion/actions/runs/41115099549/job/124267135386)), apache#26883 ([job](https://github.com/apache/datafusion/actions/runs/41120437208/job/124285496814)), apache#26974 ([job](https://github.com/apache/datafusion/actions/runs/41559552415/job/125666576696)), apache#26926 ([job](https://github.com/apache/datafusion/actions/runs/41571721394/job/125705896210)). ## What changes are included in this PR? Skip the test under `force_hash_collisions`, as apache#26594 did for another test. The imports that only this test uses move into its body, so they are not unused under the feature. ## What is the testing strategy for this PR? Test config change only. The regular `cargo test` job still runs the test. Locally (`--profile ci`), the test takes 0.92s by default and 309s with `force_hash_collisions`. With the feature, it is now skipped, and Clippy passes with and without the feature. ## Are there any user-facing changes? No.
Co-authored-by: Yongting You <2010youy01@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Which issue does this PR close?
BoundedWindowAggExeccan emit batches larger thanbatch_size#26959.Rationale for this change
BoundedWindowAggExecemits every row that becomes final in one batch, so a longRANGEpeer group,ROWS ... N FOLLOWINGorlead(x, N)can produce batches far larger thandatafusion.execution.batch_size. The issue has a reproducer.What changes are included in this PR?
executewraps the stream inBatchSplitStreamandObservedStream, asUnnestExecdoes since #24384. Larger batches go out as zero-copy slices of at mostbatch_sizerows, andoutput_batchescounts the slices.What is the testing strategy for this PR?
A new
window.sltcase runsEXPLAIN ANALYZEwithbatch_size = 2over two 5-row peer groups, one finishing mid-stream and one at the end of the input.BoundedWindowAggExecreportsoutput_batches=6, against 2 onmain.bounded_window_linear_quiet_partition_resume_standardnow uses the default batch size, so it still checks when rows become final. Thebounded_windowbenchmark is within 3% ofmainon every case, in both directions (best of six alternating runs).Are there any user-facing changes?
Only batch boundaries change, and
BoundedWindowAggExecgains abatches_splitmetric. Known limitations:ORDER BYkeys, an emission slightly overbatch_sizebecomes a full batch plus a short one.sum(v) OVER (ORDER BY k)over 1M rows with 3-row peer groups goes from 124 to 205 output batches.get_array_memory_size()per input batch, such asNestedLoopJoinExecandCrossJoinExec, charge each slice for the whole parent, as they already do for aggregate output. A nested loop join building on a 65,536-row peer group atbatch_size = 1024reserves 96 MB instead of 1.5 MB.HashJoinExeccounts shared buffers once since fix: count shared buffers once in hash join build-side memory accounting #22862.