Skip to content

Fuse partition and metrics filtering into manifest entry deserialization #3657

Description

@zenfenan

Feature Request / Improvement

When scanning a table with row filter, _open_manifest currently deserializes all live manifest entries via ManifestEntry#fetch_manifest_entry() and then applies partition and metrics filters as a second pass. This materialises the full list of entries before discarding non-matching ones.

The intermediate list and second iteration pass add overhead that scales with total entry count, not matched entry count.

Proposal:

Add ManifestFile#prune_manifest_entry() that applies the partition/metrics evaluation as the entries are deserialized, avoiding the intermediate list allocation for non-matching entries. Update _open_manifest() to use it.

Benchmark results (across multiple tables and filter expression):

Total Manifest Entries Entries Matching Filter Two-pass Time Fused Time Improvement
116k 78 (0.07%) 9.13s 7.18s -21.3%
438k 1 (~0%) 35.12s 27.81s -20.8%
823k 4,962 (0.6%) 54.38s 41.38s -23.9%
18k 269 (1.5%) 1.23s 0.90s -27.0%
8k 185 (2.2%) 0.57s 0.40s -30.2%

No behavioral change - correctness validated across all runs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions