Repository navigation
do not merge(scan): planning, physical plans, and plan execution - #10339
joseph-isaacs wants to merge 7 commits into
Conversation
9b80824 to
086bdd1
Compare
Merging this PR will regress 1 benchmark
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ❌ | WallTime | bitpack_blocked_compress_avx2 |
6.7 µs | 7.6 µs | -11.67% |
| ⚡ | Simulation | new_bp_prim_test_between[i64, 32768] |
243.5 µs | 188 µs | +29.52% |
| ⚡ | Simulation | new_bp_prim_test_between[i16, 32768] |
217.5 µs | 169.2 µs | +28.53% |
| ⚡ | Simulation | new_alp_prim_test_between[f64, 32768] |
257.8 µs | 202.1 µs | +27.53% |
| ⚡ | Simulation | new_bp_prim_test_between[i32, 32768] |
224.2 µs | 177 µs | +26.69% |
| ⚡ | Simulation | new_alp_prim_test_between[f32, 32768] |
226.1 µs | 179.7 µs | +25.78% |
| ⚡ | Simulation | new_bp_prim_test_between[i64, 16384] |
151.6 µs | 124.7 µs | +21.55% |
| ⚡ | Simulation | new_bp_prim_test_between[i16, 16384] |
135.6 µs | 112.1 µs | +20.96% |
| ⚡ | Simulation | new_alp_prim_test_between[f64, 16384] |
165.6 µs | 138.4 µs | +19.64% |
| ⚡ | Simulation | new_bp_prim_test_between[i32, 16384] |
139.6 µs | 116.9 µs | +19.42% |
| ⚡ | Simulation | new_alp_prim_test_between[f32, 16384] |
165.7 µs | 142.8 µs | +16.1% |
| ⚡ ℹ️ | Simulation | test_repeated_scan_scalar_at[int_float] |
402.5 µs | 365.3 µs | +10.18% |
Tip
Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.
Comparing ji/planning-plan-planexec (454dd29) with develop (ad42859)
Polar Signals Profiling ResultsLatest Run
Previous Runs (46)
Powered by Polar Signals Cloud |
Benchmarks: PolarSignals Profiling 📖Commits: PR datafusion / vortex-file-compressed / ns (1.041x ➖, 0↑ 1↓)
No file size changes detected. |
Benchmarks: String Encoding 📖Commits: PR vortex / vortex-file-compressed / ms (0.999x ➖, 0↑ 0↓)
vortex / vortex-file-compressed / % (1.000x ➖, 0↑ 0↓)
|
Benchmarks: FineWeb NVMe 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (1.047x ➖, 0↑ 2↓)
datafusion / vortex-compact / ns (1.284x ❌, 0↑ 6↓)
datafusion / parquet / ns (0.999x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (1.019x ➖, 3↑ 5↓)
duckdb / vortex-compact / ns (1.771x ❌, 1↑ 8↓)
duckdb / parquet / ns (0.987x ➖, 0↑ 0↓)
No file size changes detected. |
Benchmarks: TPC-H SF=1 on NVME 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (1.021x ➖, 1↑ 2↓)
datafusion / vortex-compact / ns (1.005x ➖, 1↑ 0↓)
datafusion / parquet / ns (0.998x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (1.014x ➖, 2↑ 4↓)
duckdb / vortex-compact / ns (1.020x ➖, 3↑ 6↓)
duckdb / parquet / ns (0.998x ➖, 0↑ 0↓)
No file size changes detected. |
Benchmarks: FineWeb S3 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (1.095x ➖, 1↑ 2↓)
datafusion / vortex-compact / ns (1.437x ❌, 0↑ 5↓)
datafusion / parquet / ns (1.598x ❌, 0↑ 9↓)
duckdb / vortex-file-compressed / ns (1.016x ➖, 0↑ 1↓)
duckdb / vortex-compact / ns (1.149x ➖, 0↑ 1↓)
duckdb / parquet / ns (1.193x ➖, 0↑ 3↓)
|
Benchmarks: Appian on NVME 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-compact / ns (1.012x ➖, 0↑ 0↓)
datafusion / parquet / ns (1.001x ➖, 0↑ 0↓)
duckdb / vortex-compact / ns (0.964x ➖, 2↑ 0↓)
duckdb / parquet / ns (0.995x ➖, 0↑ 0↓)
No file size changes detected. |
Benchmarks: Clickbench Sorted on NVME 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (0.971x ➖, 2↑ 0↓)
datafusion / vortex-compact / ns (0.938x ➖, 3↑ 0↓)
datafusion / parquet / ns (1.003x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (0.928x ➖, 6↑ 2↓)
duckdb / vortex-compact / ns (0.976x ➖, 4↑ 2↓)
duckdb / parquet / ns (0.998x ➖, 0↑ 0↓)
File Size Changes (200 files changed, +0.0% overall, 98↑ 102↓)
Totals:
|
Benchmarks: TPC-DS SF=1 on NVME 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (0.995x ➖, 1↑ 2↓)
datafusion / vortex-compact / ns (0.940x ➖, 26↑ 2↓)
datafusion / parquet / ns (0.998x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (1.040x ➖, 7↑ 21↓)
duckdb / vortex-compact / ns (0.871x ✅, 52↑ 17↓)
duckdb / parquet / ns (0.987x ➖, 5↑ 1↓)
No file size changes detected. |
Benchmarks: TPC-H SF=10 on NVME 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (1.039x ➖, 0↑ 3↓)
datafusion / vortex-compact / ns (1.028x ➖, 1↑ 3↓)
datafusion / parquet / ns (1.000x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (0.946x ➖, 4↑ 2↓)
duckdb / vortex-compact / ns (0.959x ➖, 3↑ 1↓)
duckdb / parquet / ns (0.992x ➖, 1↑ 0↓)
No file size changes detected. |
Benchmarks: Statistical and Population Genetics 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (1.001x ➖, 0↑ 0↓)
datafusion / vortex-compact / ns (1.009x ➖, 1↑ 1↓)
datafusion / parquet / ns (1.001x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (1.039x ➖, 0↑ 4↓)
duckdb / vortex-compact / ns (1.013x ➖, 0↑ 0↓)
duckdb / parquet / ns (0.997x ➖, 0↑ 0↓)
No file size changes detected. |
Benchmarks: Clickbench on NVME 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (0.999x ➖, 1↑ 2↓)
datafusion / vortex-compact / ns (0.894x ✅, 14↑ 0↓)
datafusion / parquet / ns (1.000x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (0.907x ➖, 15↑ 0↓)
duckdb / vortex-compact / ns (0.841x ✅, 22↑ 0↓)
duckdb / parquet / ns (0.990x ➖, 0↑ 1↓)
No file size changes detected. |
Benchmarks: Compression 📖Commits: PR vortex / vortex-file-compressed / ns (0.988x ➖, 0↑ 1↓)
vortex / vortex-file-compressed / bytes (1.000x ➖, 0↑ 0↓)
vortex / vortex-file-compressed / ratio (0.999x ➖, 0↑ 2↓)
vortex / parquet / ns (0.989x ➖, 0↑ 0↓)
vortex / parquet / bytes (1.000x ➖, 0↑ 0↓)
vortex / arrow-ipc / ns (0.984x ➖, 1↑ 0↓)
vortex / arrow-ipc / bytes (1.000x ➖, 0↑ 0↓)
|
Benchmarks: TPC-H SF=1 on S3 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (1.374x ❌, 1↑ 12↓)
datafusion / vortex-compact / ns (0.921x ➖, 4↑ 1↓)
datafusion / parquet / ns (1.099x ➖, 0↑ 2↓)
duckdb / vortex-file-compressed / ns (1.211x ➖, 1↑ 7↓)
duckdb / vortex-compact / ns (0.851x ➖, 1↑ 0↓)
duckdb / parquet / ns (1.034x ➖, 0↑ 0↓)
|
Benchmarks: TPC-H SF=10 on S3 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-compact / ns (1.375x ❌, 1↑ 16↓)
datafusion / parquet / ns (1.146x ➖, 0↑ 6↓)
duckdb / vortex-compact / ns (0.667x ✅, 12↑ 0↓)
duckdb / parquet / ns (1.138x ➖, 0↑ 2↓)
|
Benchmarks: Random Access 📖Commits: PR How to read Verdict and Engines
vortex / arrow-ipc / ns (0.999x ➖, 1↑ 2↓)
random-access / vortex-file-compressed / ns (0.998x ➖, 0↑ 0↓)
random-access / parquet / ns (0.993x ➖, 0↑ 0↓)
random-access / lance / ns (0.996x ➖, 0↑ 0↓)
|
Benchmarks: Random Access (S3) 📖Commits: PR How to read Verdict and Engines
random-access / vortex-file-compressed / ns (1.330x ❌, 0↑ 7↓)
random-access / parquet / ns (1.111x ➖, 1↑ 6↓)
random-access / lance / ns (0.964x ➖, 1↑ 0↓)
|
Benchmarks: PolarSignals Profiling 📖Commits: PR datafusion / vortex-file-compressed / ns (0.971x ➖, 1↑ 0↓)
No file size changes detected. |
Benchmarks: TPC-H SF=1 on NVME 📖Commits: PR How to read Verdict and Engines
datafusion / vortex-file-compressed / ns (1.004x ➖, 1↑ 1↓)
datafusion / parquet / ns (1.002x ➖, 0↑ 0↓)
duckdb / vortex-file-compressed / ns (1.069x ➖, 2↑ 8↓)
duckdb / parquet / ns (1.002x ➖, 0↑ 0↓)
No file size changes detected. |
6115639 to
0d20da3
Compare
…ysical plans Adds the plan operators the planner-driven scan lowers to, compiled to the push-based pipelines: - `Zoned` plans: data plus zone statistics, which an expression over statistics rewrites into a pruning plan that proves per-zone results once and expands them to the selected rows. - `Share` plans, which canonicalize a whole child once and serve its rows. - `Take` keeps whether its values may be reused, and the expression rule pushes the negative-cost part of an expression beneath a share of dictionary values. - `Eval` applies compound infallible predicates to encoded values (dictionary, run-end, PCO) before expanding them. - `ValueCache` keeps whole values, such as dictionary values, between the scans that share it; its owner bounds its lifetime. - `WholeSource` collects an inlet whole before producing one batch. - Scans only count shared segments over the rows their splits read. - Flat layouts lower to a filtered segment scan, and zoned layouts lower. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01P1oQtzTgSzkvrGDKisoNko Signed-off-by: Claude <[email protected]>
Serves the planning protocol's `IoService` reads of a file: - `FileIoService` coalesces the ranges a batch of requests or announcements asks for, reads each range once for every session interested in it, and withdraws a dropped session's interest. `FileScanIo` serves the same protocol through the file's segment source and read driver. - Local files reuse their handles and admit native reads up to a bound; object-store reads stream completions as they land. - The read driver keeps its coalescing scratch between passes and can leave optional requests out of coalescing. - Segment caches can answer synchronously from `get_if_ready`. - Request tracing ids for diagnostics. A file opened over a reader carries the service as `VortexFile::scan_io`. Nothing drives it yet; the planning scan that does follows separately. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01P1oQtzTgSzkvrGDKisoNko Signed-off-by: Claude <[email protected]>
An opt-in scan (`VORTEX_SCAN_V2=1`) that lowers a file's layout once into a physical plan and runs each split through planners on the planning protocol: - vortex-scan: a planning driver that runs planners and morsels, publishes their IO through an `IoService`, and traces their work. - vortex-file: footer open and footer prune stages, and `scan_file` to describe a file to the scan. - vortex-layout: announce, pruning, filter (adaptive conjunct order) and projection planners whose plans run on the pipeline `Scan`, one scan per stage of a split, with a `ValueCache` shared by a split's scans and dropped with it. The V2 `ScanBuilder`/`RepeatedScanV2`, plan-derived splits, early IO announcements and file pruning. - DataFusion and DuckDB select V2 when it is enabled and supported. Files with list columns, and scans combining a filter with a limit, use the default executor. - DuckDB can prepare later files while earlier ones scan (`VORTEX_DUCKDB_FILE_PREFETCH`, off by default); DataFusion reports predicate and IO diagnostics. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01P1oQtzTgSzkvrGDKisoNko Signed-off-by: Claude <[email protected]>
Kept for reference on this branch only: - scripts and reports from the V2 driver and IO measurements (`scripts/`, `vortex-scan/design/`, `benchmarks/*.md`) - benchmark runner diagnostics and perf counters (`benchmarks/*-bench`, `vortex-bench`), and agent skill tweaks - `VORTEX_SCAN_V2=1` in the test and SQL benchmark workflows - bit-packed BETWEEN tests over sliced arrays, which belong with #10378 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01P1oQtzTgSzkvrGDKisoNko Signed-off-by: Claude <[email protected]>
0d20da3 to
1c932c1
Compare
Keep the original feature branch's current pipeline implementation and IO optimizations. Add resumable cold comparisons, current-pressure noise gates, phase distributions, and request/byte queue occupancy. Remove presets for rejected backend prototypes while retaining historical trace parsing. Enable descriptor reuse, native32 admission, and demanded-extent coalescing for local PR SQL benchmarks. Preserve remote runs and develop defaults. Document the refreshed validation and keep historical performance claims tied to their measured source. Validation: 224 file tests, 197 IO tests, 60 Python tool tests, strict IO Clippy, scoped Ruff/ty, workflow yamllint, and patch whitespace pass. Signed-off-by: Joe Isaacs <[email protected]>
Resolve current develop conflicts before rerunning the original V2 feature PR. Keep upstream legacy-zone conversion, pruning invalidation, shared-array placement and pointer-keyed caching. Adapt V2 zone lowering and encoded Eval to those interfaces while retaining the feature branch's cache safeguards. Combine DuckDB V2 preparation with deferred scan-state destruction outside the global lock. Make legacy optional-coalescing tests select their policy explicitly so the measured demanded-only preset can run the full suite. Validation: 1,356 passing Rust library tests, 421 additional IO/file test executions under the optimized policy, and 60 Python tests. Strict Clippy for the affected crates and benchmark, pinned formatting, Ruff, ty and workflow yamllint pass. Historical cold-SSD results remain source-specific. Signed-off-by: Joe Isaacs <[email protected]>
Bring in list-layout edition gating and NaN-aware exported statistics. The merge applies cleanly and preserves the feature branch IO changes. Signed-off-by: Joe Isaacs <[email protected]>
commented
Nov 3, 2026
|
Closing as superseded: the V2 planning design landed on Generated by Claude Code |
Summary
Do not merge. This is the whole V2 scan in one place, for review and benchmarking. It is rebuilt on
develop's push-based pipelines (#10391–#10393): every physical plan now runs on the pipelineScan, and this PR's earlier ExecGraph and PipelineGraph executors are removed.The mergeable pieces are a stack of draft PRs:
Share,Takevalue rules,Evalon encoded predicates, zoned lowering, per-splitValueCache,WholeSource.FileIoService/FileScanIo,read_atchanges, read driver, andget_if_readyon segment caches.ScanBuilder, and DataFusion/DuckDB selection.This branch is those three commits plus one do-not-merge commit holding:
VORTEX_SCAN_V2=1in the test and SQL-benchmark workflows, so the SQL benchmarks here compare V2 againstdevelop's default scanPrevious head: 6115639.
Changes
Scan.ValueCachethat is dropped with the split. Zone tables live for the query. Nothing decoded is kept across scans.Local results on a 4-core VM, DataFusion over Vortex at SF=1, V2/V1 geomean of per-query medians:
No reproducible regressions when the apparent losses were rerun with alternating V1/V2 runs.
🤖 Generated with Claude Code
https://claude.ai/code/session_01P1oQtzTgSzkvrGDKisoNko