[PERF] Filter blocks by key range in get_range#7120
Merged
Sicheng-Pan merged 2 commits intoMay 26, 2026
Conversation
Contributor
Author
This stack of pull requests is managed by Graphite. Learn more about stacking. |
Reviewer ChecklistPlease leverage this checklist to ensure your code review is thorough before approving Testing, Bugs, Errors, Logs, Documentation
System Compatibility
Quality
|
ea1e979 to
bcda98e
Compare
HammadB
approved these changes
May 26, 2026
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.

Summary
Pass the key range through to get_block_ids_range so that get_range / get_range_stream can eliminate blocks that can't contain any matching keys. Previously, block resolution only filtered by prefix — a narrow key range query like get_range(""..="", 42..=42) would load all blocks for prefix "" even when only 1 block contains key 42.
Approach
When a block's start and end delimiters share the same prefix, the block covers a single prefix and its key range is known ([start.key, end.key)). We check if this range overlaps the query key range using the same MAX(start) <= MIN(end) overlap pattern used for prefix filtering.
First and last blocks (with Start delimiter or no end delimiter) are not eliminated — their key range is unbounded on one side. This is at most 2 extra blocks loaded per query, which is acceptable.
Key range bounds are converted to KeyWrapper once outside the filter loop to avoid per-block allocations.
Changes