Repository navigation
Avoid dictionary promotion for plain Parquet pages - #26973
Rich-T-kid wants to merge 1 commit into
Conversation
|
run benchmark clickbench_partitioned env:
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true" |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing codex/dictionary-only-pages (03cf12c) to 0e314cc (merge-base) diff Run configurationrun benchmark clickbench_partitioned
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing codex/dictionary-only-pages (03cf12c) to 0e314cc (merge-base) diff Run configurationrun benchmark clickbench_partitioned
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usageclickbench_partitioned — base (merge-base)
clickbench_partitioned — branch
File an issue against this benchmark runner |
03cf12c to
e66caad
Compare
|
run benchmark tpch tpcds clickbench_partitioned wide_schema env:
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9" |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark wide_schema
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark clickbench_partitioned
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark tpcds
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark tpch
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark tpch
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usagetpch — base (merge-base)
tpch — branch
File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark tpcds
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usagetpcds — base (merge-base)
tpcds — branch
File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark clickbench_partitioned
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usageclickbench_partitioned — base (merge-base)
clickbench_partitioned — branch
File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing e66caad (e66caad) to b8534c7 diff Run configurationrun benchmark wide_schema
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "b8534c7fd836f23e99f3f95fccea53cd7e167bff"
changed:
ref: "e66caad9042cf570a605da822e480a02845360b9"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usagewide_schema — base (merge-base)
wide_schema — branch
File an issue against this benchmark runner |
|
I followed up on Q28 because it was the only material regression in the current hosted ClickBench run. Four balanced local runs ( I do not see a reproducible Q28 regression locally, so I have left the page-encoding policy unchanged. |
Which issue does this PR close?
What changes are included?
With
enable_rle_to_dictionary=true, DataFusion currently promotes a column when any row group has a dictionary page. If later pages fall back to plain encoding, the reader rebuilds dictionaries per batch and can be much slower than the plain path.This change only promotes a column when page encoding statistics show that every data page is dictionary encoded and a dictionary page is present. Missing evidence keeps the plain type. Directory schema inference also keeps the plain type when files disagree.
Commit: Avoid dictionary promotion for plain Parquet pages
Performance
The current hosted run compares exact SHAs with dictionary reads enabled on both sides:
Testing
cargo test -p datafusion-datasource-parquet --lib(296 tests)cargo test --test sqllogictests -- information_schemacargo clippy --workspace --all-targets --all-features -- -D warningscargo fmt --all -- --check./dev/update_config_docs.shUser-facing change
Columns with plain fallback pages, or without page encoding statistics, remain their plain string or binary type when dictionary reads are enabled.