Skip to content

TPC-DS with Paimon input and output

The opt-in TPC-DS harness imports all 103 SQL variants for the 99 templates from Apache Flink release 2.2.1. It runs the SQL unchanged against 24 Paimon input tables and commits each query's result to a typed Paimon output table. The source manifest records the immutable upstream commit and SHA-256 of every query and schema.

The released io.trino.tpcds:tpcds:1.4 generator prepares the inputs through Paimon's Java SDK outside timing. Its p_response_targe column spelling is matched by ordinal to Flink's p_response_target; all 425 column names and types are checked. SF1 is the comparison scale. Smaller data is useful for auditing but can produce division by zero in otherwise valid upstream queries; the harness does not rewrite those queries.

Both engines receive identical data, schemas, parallelism, compression and memory settings. Like Flink's own TPC-DS runner, both enable join reordering and a 10 MiB broadcast threshold. Catalog statistics use observed row/null counts, integral/date bounds and string lengths, plus released Flink NDV estimates capped by non-NULL rows. Decimal bounds are omitted to avoid rounding a decimal interval into an unsafe double bound. Prepared fixtures are owned, checksummed and reused only when their manifest matches.

The tpcds profile uses production JVM assertion settings. In released Flink, an IN predicate over a string column can estimate selectivity above one when the list has more values than the column's NDV. The planner's Java assertion rejects that estimate in Q73 under -ea; a normal production JVM proceeds. This profile affects the benchmark module and retains every JUnit schema, result and native-work assertion. The unchanged upstream qualification suites run with their existing settings.

Run the suite

Use a release native build and an owned scratch directory:

SF_TPCDS=true mvn test -Ppaimon,bench,tpcds -pl streamfusion-paimon -am \
  -Dtest=PaimonTpcdsBenchmark -Dsurefire.failIfNoSpecifiedTests=false \
  -Dsf.tpcds.directory=/path/to/owned/tpcds-run \
  -Dsf.tpcds.scale=1 -Dsf.tpcds.mode=compare

Modes are prepare, plan, audit, verify and compare. audit records fallbacks; verify and compare require native source and compute work in addition to exact results. compare defaults to three warmups and seven measured trials per engine, alternating engine order. sf.tpcds.queries accepts a comma-separated diagnostic selection; only an empty selection denotes the complete suite. sf.tpcds.parallelism defaults to two and sf.tpcds.nativeBytes to 536870912. The legacy adapter shares the harness through -Ppaimon1,bench,tpcds with its matching released Flink line.

For queries that previously fell back for computation, sf.tpcds.compute=stock keeps native Paimon input/output and uses stock computation. Its report labels the engine native_io_stock_compute and asserts that no native compute ran. This is a controlled ablation on the current engine, including its corrected shared-buffer ownership, rather than a rebuilt historical release. It includes the row/Arrow conversions needed between stock computation and native IO. Fully native runs require zero entry transposes and zero source fallback rows.

sf.tpcds.shuffleCompression=false is a matched diagnostic that disables Flink's blocking-shuffle compression for both engines. It defaults to true, as in the primary cohort. Changed-configuration diagnostics remain separate from primary results.

sf.tpcds.comparePreviousShuffle=true adds a matched third engine in compare mode with native computation. Every trial rotates stock Flink, StreamFusion with its preceding Java shuffle decoder (streamfusion_java_lz4), and StreamFusion with native LZ4 (streamfusion). The two StreamFusion variants share the same physical plan, sources, sinks and resources. Only the task-local decoder setting changes, held constant until the job and readback finish. Stock tasks retain Flink's decoder. Three warmups and seven measured trials per engine produce 3,090 jobs over the complete suite. Reports retain the resolved LZ4 artifact/hash, native input-gate/block/byte counters and fallback counts. Native decoder fallback fails the supported-host comparison; the Java control requires zero native blocks. The original two-engine mode remains available. Native LZ4 shuffle decoding describes the implementation and TaskManager/JVM override.

Timing starts before SQL submission and ends after the final Paimon commit. Input preparation, output DDL and stock readback are outside timing. The verifier compares exact typed result multisets, preserving duplicates, NULLs, decimal scales and floating bit patterns. It checks committed row counts, native Parquet footers, source counters, compute counters and stock's absence of native work. Each report records physical input/output files, splits, partitions and buckets, along with plans and callback lists. Inputs and outputs are unpartitioned tables; query parallelism and hash exchanges are recorded separately from table partitioning. Diagnostic sf.tpcds.retainGauges=true retains deployed/planned share counts; regular repeated comparisons retain counters.

The report is rewritten after each query. Output tables are removed after validation; remove the owned run directory after retaining concise benchmark evidence. This is an engine comparison using TPC-DS-derived queries, not an audited TPC benchmark result.

Qualification

CI plans every unchanged variant against generated SF0.01 Paimon fixtures on both supported Flink lines and the legacy Paimon adapter. These checks require native source and compute planning; they do not execute the full suite. SQL operator tests cover runtime edge cases separately. SF1 verification and repeated comparisons add exact committed results, actual compute counters and output encoder checks.

Native LZ4 matched comparison, 2026-11-15

All 103 variants completed 3,090 jobs: three warmups and seven measured runs for each of stock Flink, StreamFusion with the preceding Java decoder, and StreamFusion with JNI LZ4. Every committed result matched exactly in type and multiset. Both StreamFusion controls had native source, real compute and native Parquet output evidence, with zero source fallbacks and zero entry transposes.

The geometric mean of per-query median ratios is 2.2823× versus stock Flink and 1.1141× versus the Java-decoder control (about 10.2% less elapsed time for the latter geometric comparison). JNI-enabled StreamFusion wins 100/103 variants against stock and 90/103 against the Java control. These are complete job timings, including SQL submission, production Arrow IPC, IO and final Paimon commit.

Engine Sum of per-query medians
Stock Flink 169.180 s
StreamFusion, Java LZ4 decoder 69.567 s
StreamFusion, JNI LZ4 decoder 62.269 s

These sums exclude fixture preparation, output DDL and stock readback. They are not the harness wall-clock duration. All trial times and min/median/max ranges are retained in the structured report.

The frozen, clean measured source is 7820d4787c46f50241aba31e0fdbd32e98d2c6c6, based on main 2a304d577. Both StreamFusion controls use this same source and the same release/mimalloc libraries; only the task-local decoder setting changes. The environment is Flink 2.2.1, Paimon 2.1.0, Temurin 17.0.17, Apple M4/16 GiB on a shared host, 8 GiB heap, default parallelism two, 512 MiB native budget, 1 GiB Flink managed memory, 8,192-row batches, Snappy Parquet files and production Arrow IPC exchanges (zeroCopyLocal=false). Input preparation is unchanged.

The resolved codec is at.yawk.lz4:lz4-java:1.10.3. All 1,030 JNI-enabled jobs registered native decoder gates. Successful JNI calls decoded 10,324,169 blocks and 322,589,762,057 bytes, with zero decoder fallbacks. Stock and Java-decoder controls reported zero native decoder calls. Native source-row totals match between the two StreamFusion controls: 6,990,877,570 rows each, including warmups.

The remaining losses to stock are Q88, Q90 and Q96. JNI LZ4 improves each over its Java-decoder control, but does not eliminate those end-to-end losses. The 13 losses to the Java control are Q8, Q14b, Q33, Q38, Q41, Q44, Q49, Q57, Q70, Q72, Q77, Q94 and Q99. All are retained below; the optimization is not a uniform per-query win. This cohort did not profile those remaining losses.

The historical comparison below remains separate. Different source revisions, run times and shared-host conditions prevent attributing its entire difference from this cohort to LZ4. Use the matched Java/JNI controls to assess this change.

Query Stock ms Java LZ4 ms JNI LZ4 ms Stock / JNI Java / JNI
1 450.956 200.922 195.820 2.303× 1.026×
2 1301.305 324.082 306.799 4.242× 1.056×
3 421.424 286.195 246.522 1.709× 1.161×
4 2630.796 976.732 843.743 3.118× 1.158×
5 1465.137 750.514 580.266 2.525× 1.293×
6 681.680 321.118 288.270 2.365× 1.114×
7 840.136 604.483 488.492 1.720× 1.237×
8 2724.236 732.472 741.614 3.673× 0.988×
9 3984.867 3214.370 3145.256 1.267× 1.022×
10 611.974 398.921 356.465 1.717× 1.119×
11 2009.472 695.638 687.744 2.922× 1.011×
12 311.057 188.965 178.810 1.740× 1.057×
13 995.682 290.340 289.249 3.442× 1.004×
14a 2224.098 1341.018 1309.857 1.698× 1.024×
14b 3006.021 1513.776 1628.478 1.846× 0.930×
15 273.379 181.636 165.447 1.652× 1.098×
16 1098.359 316.472 268.667 4.088× 1.178×
17 752.413 393.794 342.769 2.195× 1.149×
18 783.130 451.180 383.021 2.045× 1.178×
19 468.937 428.506 354.061 1.324× 1.210×
20 281.869 203.187 185.846 1.517× 1.093×
21 706.837 747.693 585.995 1.206× 1.276×
22 3778.347 1781.233 1673.223 2.258× 1.065×
23a 3607.864 1237.299 1167.086 3.091× 1.060×
23b 3398.010 1197.934 994.227 3.418× 1.205×
24a 692.488 474.106 407.265 1.700× 1.164×
24b 645.073 429.945 365.525 1.765× 1.176×
25 905.917 492.973 412.015 2.199× 1.196×
26 653.848 359.661 301.325 2.170× 1.194×
27 868.924 592.726 501.523 1.733× 1.182×
28 1382.945 452.446 425.363 3.251× 1.064×
29 929.754 519.922 446.945 2.080× 1.163×
30 595.633 352.991 334.108 1.783× 1.057×
31 1940.870 874.536 576.491 3.367× 1.517×
32 416.030 302.925 228.293 1.822× 1.327×
33 836.742 526.972 566.756 1.476× 0.930×
34 607.638 412.823 371.382 1.636× 1.112×
35 757.991 397.704 371.664 2.039× 1.070×
36 1597.062 676.663 537.634 2.971× 1.259×
37 923.974 410.748 331.081 2.791× 1.241×
38 877.169 441.408 573.002 1.531× 0.770×
39a 4760.094 1437.411 1160.121 4.103× 1.239×
39b 4696.760 1680.231 1329.804 3.532× 1.264×
40 409.298 330.995 282.289 1.450× 1.173×
41 374.664 160.265 191.465 1.957× 0.837×
42 544.622 324.390 277.419 1.963× 1.169×
43 1203.487 376.729 310.849 3.872× 1.212×
44 785.780 254.258 259.234 3.031× 0.981×
45 380.827 276.965 197.257 1.931× 1.404×
46 892.333 1092.512 735.421 1.213× 1.486×
47 2604.960 1869.289 1600.572 1.628× 1.168×
48 1877.448 444.766 397.670 4.721× 1.118×
49 1333.735 384.911 554.278 2.406× 0.694×
50 964.850 399.866 366.511 2.633× 1.091×
51 1670.553 994.342 823.512 2.029× 1.207×
52 579.512 519.575 336.132 1.724× 1.546×
53 19610.047 1402.012 1312.698 14.939× 1.068×
54 728.382 343.548 323.291 2.253× 1.063×
55 479.375 294.292 244.422 1.961× 1.204×
56 776.553 447.550 378.224 2.053× 1.183×
57 1336.258 780.304 801.329 1.668× 0.974×
58 860.439 399.948 338.656 2.541× 1.181×
59 1949.591 545.636 521.231 3.740× 1.047×
60 657.505 449.832 340.840 1.929× 1.320×
61 1772.408 474.075 395.768 4.478× 1.198×
62 622.699 249.951 226.088 2.754× 1.106×
63 20207.449 1344.049 1341.996 15.058× 1.002×
64 1860.511 1589.285 1265.884 1.470× 1.255×
65 693.893 495.695 356.825 1.945× 1.389×
66 1148.814 391.483 354.032 3.245× 1.106×
67 4668.757 1734.361 1710.137 2.730× 1.014×
68 813.895 761.943 701.025 1.161× 1.087×
69 534.516 294.316 289.462 1.847× 1.017×
70 1216.038 387.171 395.685 3.073× 0.978×
71 520.574 370.446 328.346 1.585× 1.128×
72 3385.104 1174.564 1208.762 2.800× 0.972×
73 429.442 292.089 261.076 1.645× 1.119×
74 1678.882 653.294 579.723 2.896× 1.127×
75 1239.880 782.729 732.225 1.693× 1.069×
76 897.089 205.045 203.278 4.413× 1.009×
77 848.696 505.972 514.602 1.649× 0.983×
78 1536.139 1062.302 880.536 1.745× 1.206×
79 679.988 578.398 527.766 1.288× 1.096×
80 1040.153 755.160 662.051 1.571× 1.141×
81 507.861 197.869 182.333 2.785× 1.085×
82 932.601 300.044 271.152 3.439× 1.107×
83 347.503 252.342 213.597 1.627× 1.181×
84 276.885 170.576 159.988 1.731× 1.066×
85 3571.212 396.010 342.458 10.428× 1.156×
86 335.020 181.298 170.249 1.968× 1.065×
87 919.456 309.746 290.263 3.168× 1.067×
88 4479.318 6137.775 5234.699 0.856× 1.173×
89 677.509 405.080 338.697 2.000× 1.196×
90 487.390 799.790 727.510 0.670× 1.099×
91 622.197 180.880 173.186 3.593× 1.044×
92 509.805 187.037 164.686 3.096× 1.136×
93 1396.920 578.883 532.661 2.623× 1.087×
94 784.711 247.235 295.530 2.655× 0.837×
95 1724.932 324.345 310.357 5.558× 1.045×
96 1082.268 2084.082 1756.729 0.616× 1.186×
97 736.800 342.760 299.453 2.460× 1.145×
98 470.849 307.241 260.016 1.811× 1.182×
99 605.163 355.443 369.147 1.639× 0.963×

The native LZ4 evidence manifest retains the raw full plans/reports, trial log, runtime hashes, compatibility evidence and reproduction helpers in a separately versioned public archive. Datasets and build trees are excluded. The archive is independently downloaded and verified before temporary resources are removed.

from pathlib import Path
import sys
sys.path.insert(0, "dev")
from benchmark_artifacts import fetch
fetch(["docs/benchmarks/paimon-native-lz4-20261115-evidence"],
      Path("/path/to/owned/evidence"), Path("/path/to/owned/cache"),
      Path("docs/benchmarks/results/paimon-native-lz4-evidence-20261115.json"))

Historical Java-decoder comparison, 2026-11-14

All 103 variants completed all 2,060 trials, including warmups, with exact committed result types/multisets and positive native source, compute and output evidence. Every native trial had zero source fallback and zero entry-transpose rows. Nonempty native outputs had parquet-rs footers; stock runs had no native work or encoders.

The recorded source is bdfa739c59699682cbd561c4140183afeb5464ee, based on main's compatibility-based batch admission in 918716ab8. The frozen runtime records Java artifact and native-library hashes. Flink 2.2.1/Paimon 2.1.0 ran on an Apple M4 with 16 GiB RAM, JDK 17.0.17, an 8 GiB heap, parallelism two, 512 MiB native memory, 1 GiB Flink managed memory, 8,192-row batches and production Arrow IPC exchanges.

Native medians were faster for 85 variants and slower for 18. The geometric mean stock/native ratio was 1.6697×. Summing the per-query medians gives 195.919 s stock versus 100.825 s StreamFusion, a 1.9432× ratio. These sums exclude fixture preparation, output DDL and stock readback, as do the individual timers; they are not the wall-clock duration of the benchmark harness.

This is a warm-cache comparison on a shared local host. A recorded host observation showed active swap and other JVM activity. Trial ranges retain that variability; these measurements do not isolate the effect of the admission-policy change or identify the cause of individual regressions. Profiling remains separate from this unprofiled primary cohort.

Median milliseconds (minimum–maximum), including submission through final commit. A stock/native ratio below one indicates a slower native median.

Query variant Stock Flink StreamFusion Stock / native
1 472.2 (441.2–560.5) 340.2 (301.7–426.9) 1.39×
2 1,515.9 (1,379.9–3,629.1) 525.1 (489.6–1,106.0) 2.89×
3 612.6 (570.9–808.7) 630.3 (577.8–813.5) 0.97×
4 4,536.1 (3,937.5–5,307.8) 1,698.9 (1,367.0–1,765.3) 2.67×
5 1,851.2 (1,360.5–2,145.0) 1,165.4 (1,063.9–1,509.1) 1.59×
6 859.5 (603.5–1,017.0) 470.0 (432.0–608.8) 1.83×
7 1,393.8 (924.7–2,066.2) 1,252.9 (1,204.8–1,564.7) 1.11×
8 3,062.7 (2,599.2–4,004.5) 1,053.8 (904.8–1,276.7) 2.91×
9 3,765.0 (2,561.8–5,113.6) 2,666.9 (2,351.2–3,461.2) 1.41×
10 721.5 (580.6–893.4) 796.4 (707.2–868.3) 0.91×
11 3,075.6 (2,533.0–3,465.3) 1,129.2 (1,007.0–1,591.7) 2.72×
12 458.1 (395.7–704.4) 335.3 (289.8–426.5) 1.37×
13 1,605.3 (1,090.3–2,205.7) 455.5 (364.3–526.2) 3.52×
14a 3,561.3 (3,062.6–3,797.8) 2,423.6 (1,808.7–2,965.9) 1.47×
14b 5,222.9 (4,333.1–6,048.1) 4,148.9 (3,679.0–6,050.8) 1.26×
15 463.8 (300.7–793.5) 432.8 (349.4–481.9) 1.07×
16 1,891.2 (1,736.3–2,422.0) 674.6 (621.4–779.1) 2.80×
17 768.6 (739.5–938.7) 793.2 (699.0–947.7) 0.97×
18 901.7 (783.8–1,178.3) 1,220.6 (1,043.1–1,823.0) 0.74×
19 502.3 (470.7–579.7) 800.1 (649.7–899.1) 0.63×
20 446.8 (271.1–488.3) 436.2 (386.6–494.3) 1.02×
21 737.2 (653.1–1,745.8) 2,243.9 (1,682.8–3,762.4) 0.33×
22 4,123.3 (3,495.8–6,722.6) 3,185.1 (2,857.8–3,605.8) 1.29×
23a 7,958.8 (5,776.0–9,514.4) 2,772.7 (2,005.8–3,591.9) 2.87×
23b 6,634.7 (4,542.3–8,900.1) 2,497.6 (1,710.7–3,326.6) 2.66×
24a 732.6 (646.7–855.4) 980.1 (634.8–1,065.7) 0.75×
24b 754.0 (637.8–890.4) 1,050.2 (906.9–1,227.3) 0.72×
25 1,383.9 (965.7–1,842.6) 1,301.4 (978.4–1,504.4) 1.06×
26 725.3 (621.9–899.7) 834.7 (720.5–1,681.4) 0.87×
27 927.5 (838.7–1,085.7) 1,580.8 (1,506.9–2,063.5) 0.59×
28 1,242.1 (1,031.0–1,345.8) 432.5 (404.1–607.0) 2.87×
29 857.2 (756.8–1,319.5) 880.5 (634.6–948.0) 0.97×
30 425.1 (383.8–542.7) 300.6 (281.2–593.9) 1.41×
31 1,998.4 (1,873.9–2,297.9) 1,040.5 (950.6–1,112.8) 1.92×
32 469.7 (367.1–618.5) 507.8 (446.6–667.7) 0.93×
33 455.3 (440.0–697.1) 904.4 (777.3–1,086.7) 0.50×
34 481.9 (399.2–570.7) 313.0 (307.5–380.5) 1.54×
35 600.7 (577.0–673.9) 317.3 (313.4–331.5) 1.89×
36 1,006.3 (884.5–1,830.2) 654.1 (599.8–687.7) 1.54×
37 804.9 (701.2–888.1) 292.1 (284.0–306.0) 2.76×
38 717.8 (635.4–950.3) 307.1 (301.4–334.5) 2.34×
39a 3,300.2 (3,235.5–3,423.3) 1,144.0 (1,126.7–1,197.3) 2.88×
39b 3,228.0 (3,193.1–3,363.2) 1,204.2 (1,195.4–1,293.6) 2.68×
40 341.9 (300.1–522.7) 251.5 (242.1–265.9) 1.36×
41 188.1 (174.4–272.4) 116.8 (110.7–130.3) 1.61×
42 362.4 (337.7–544.5) 324.4 (308.8–342.2) 1.12×
43 865.7 (794.9–1,034.0) 383.3 (349.9–590.1) 2.26×
44 560.6 (488.7–736.6) 229.4 (219.3–260.3) 2.44×
45 403.0 (325.6–535.5) 228.3 (210.9–345.5) 1.77×
46 774.9 (678.5–884.5) 654.4 (631.5–987.6) 1.18×
47 1,662.3 (1,591.1–1,908.1) 1,144.4 (1,000.3–1,244.5) 1.45×
48 1,012.5 (944.5–1,122.4) 330.8 (294.6–352.7) 3.06×
49 890.4 (852.7–985.2) 348.6 (284.5–358.8) 2.55×
50 667.9 (605.2–782.8) 325.4 (314.8–345.9) 2.05×
51 1,256.0 (1,205.5–1,358.8) 778.9 (755.6–910.5) 1.61×
52 416.7 (378.7–487.3) 313.4 (296.5–350.9) 1.33×
53 18,812.1 (18,242.0–19,892.1) 1,492.4 (1,435.1–1,705.5) 12.61×
54 616.9 (567.8–700.5) 362.8 (345.5–411.1) 1.70×
55 424.9 (370.0–663.8) 321.4 (311.2–461.6) 1.32×
56 653.7 (491.3–803.7) 543.7 (468.5–686.5) 1.20×
57 1,045.2 (911.3–1,433.4) 992.8 (754.4–1,056.2) 1.05×
58 1,122.2 (954.0–1,405.4) 523.0 (390.5–792.6) 2.15×
59 2,563.2 (2,305.8–3,775.6) 647.2 (584.4–717.1) 3.96×
60 787.8 (518.4–974.8) 580.5 (456.6–1,069.2) 1.36×
61 1,971.8 (1,594.8–2,316.2) 665.5 (499.5–890.2) 2.96×
62 514.5 (406.4–549.6) 349.4 (272.0–432.5) 1.47×
63 20,748.3 (18,747.1–39,418.0) 1,568.7 (1,414.1–1,925.0) 13.23×
64 3,189.5 (2,085.7–3,744.3) 2,400.1 (2,115.7–2,772.2) 1.33×
65 811.5 (722.0–1,330.3) 559.6 (483.5–696.4) 1.45×
66 1,614.5 (1,212.0–2,137.6) 547.5 (495.9–871.3) 2.95×
67 7,674.1 (5,850.1–10,471.0) 2,301.0 (2,143.6–2,761.9) 3.34×
68 945.4 (860.9–1,156.8) 1,039.0 (809.6–1,263.1) 0.91×
69 774.4 (568.9–920.3) 600.4 (443.4–712.6) 1.29×
70 1,521.3 (1,192.0–1,783.5) 574.1 (468.6–712.1) 2.65×
71 724.3 (569.4–933.2) 535.3 (432.5–765.4) 1.35×
72 4,771.5 (4,643.5–5,462.4) 1,728.2 (1,398.6–1,869.6) 2.76×
73 500.7 (376.4–941.3) 421.4 (346.3–540.2) 1.19×
74 2,632.0 (2,040.0–3,603.0) 738.9 (596.5–1,193.9) 3.56×
75 2,236.9 (1,728.8–2,392.8) 1,411.1 (975.0–1,856.6) 1.59×
76 843.9 (556.9–1,034.9) 378.4 (282.9–563.0) 2.23×
77 1,224.1 (1,104.4–1,746.9) 720.1 (489.6–798.5) 1.70×
78 2,236.1 (2,072.2–2,402.7) 1,690.4 (1,493.4–2,061.8) 1.32×
79 951.6 (675.0–1,242.9) 1,127.2 (884.3–1,225.2) 0.84×
80 2,142.5 (1,181.3–2,524.8) 1,223.8 (1,103.1–1,452.6) 1.75×
81 496.6 (491.3–757.5) 285.1 (199.8–298.3) 1.74×
82 1,112.1 (917.5–1,245.1) 431.6 (365.5–592.3) 2.58×
83 596.7 (467.8–852.5) 283.8 (233.3–509.4) 2.10×
84 446.8 (367.5–561.6) 215.7 (181.2–282.2) 2.07×
85 4,636.3 (3,299.3–8,522.8) 636.0 (562.9–700.0) 7.29×
86 845.1 (585.5–954.8) 408.7 (339.0–488.2) 2.07×
87 998.8 (880.4–1,617.9) 454.1 (356.2–501.6) 2.20×
88 4,988.6 (4,576.2–7,926.4) 10,242.7 (7,213.5–14,717.4) 0.49×
89 537.3 (519.3–928.3) 460.8 (448.0–499.3) 1.17×
90 591.1 (473.9–1,063.8) 1,197.1 (1,016.9–1,884.4) 0.49×
91 868.2 (570.7–2,080.1) 258.6 (184.4–364.1) 3.36×
92 582.4 (475.7–868.3) 391.8 (257.1–502.8) 1.49×
93 1,498.9 (1,282.1–2,220.2) 747.2 (605.7–828.4) 2.01×
94 1,134.3 (938.7–1,428.9) 351.7 (304.6–621.6) 3.23×
95 2,025.4 (1,886.9–2,452.8) 449.4 (360.9–991.9) 4.51×
96 1,339.6 (1,209.4–1,669.4) 2,982.5 (2,784.9–3,371.8) 0.45×
97 931.7 (723.5–1,231.1) 493.0 (355.2–528.1) 1.89×
98 695.1 (572.8–776.2) 388.9 (364.5–559.0) 1.79×
99 883.5 (728.2–924.5) 477.9 (427.6–574.2) 1.85×

Every warmup/measured trial, ranges, typed-result hashes and native-work witnesses are retained with the input/schema/query and runtime identities.

The pre-rebase partial cohort was stopped at 65 completed variants when main adopted the new batch policy. Its partial Q14b stock run failed a released Flink initialization-metrics timestamp invariant. That cohort, including its losses and partial trials, is diagnostic and is excluded from the complete comparison above.

Previous fallback control

Nine queries that previously needed stock computation were repeated with native Paimon IO and stock computation: 5, 6, 8, 14b, 22, 24a, 36, 44 and 53. All 180 trials passed exact results, native IO/sink evidence and the absence of native compute. Input, runtime hashes, resources, three warmups and seven measured repetitions match the primary configuration. The source ownership correction is held constant.

This control loses to its paired stock engine in eight of nine cases (geometric stock/control ratio 0.7625×). It includes the row/Arrow boundaries around stock computation; it does not isolate decoder or encoder kernel speed. The comparison below also shows native-compute medians from the separate complete cohort. Their direct ratio is descriptive across cohorts, not a simultaneous three-engine trial or an estimate that removes shared-host variation.

Median milliseconds; ranges and every observation remain in the structured report.

Query Stock in control cohort Native IO / stock compute Native compute in full cohort Previous / native compute
5 1,120.1 1,450.5 1,165.4 1.24×
6 481.2 692.6 470.0 1.47×
8 2,290.5 2,012.5 1,053.8 1.91×
14b 3,277.9 5,837.0 4,148.9 1.41×
22 3,480.8 5,030.2 3,185.1 1.58×
24a 672.6 1,076.8 980.1 1.10×
36 973.7 1,551.8 654.1 2.37×
44 554.3 571.7 229.4 2.49×
53 19,084.2 19,748.8 1,492.4 13.23×

The complete previous-fallback control retains its paired stock timings, variability, exact-result hashes and runtime proof.

Regression diagnostics

Q21, Q33 and Q88 were repeated under JFR after the unprofiled comparisons finished. All 60 trials retained exact committed results and native execution checks. The large primary Q21/Q33 slowdowns did not reproduce; Q88 remained slightly slower. These diagnostic medians do not replace any primary observation.

Query Profiled stock, ms Profiled StreamFusion, ms
21 888.3 854.8
33 648.4 561.0
88 5,628.6 6,055.7

The combined profile contains substantial Java shuffle-decompression work: LZ4JavaSafeFastDecompressor occurs inclusively in 5,911 of 6,712 Java execution samples on native-named workers (88.1%), and 4,278 of 6,399 on stock-named workers (66.9%). Thread names classify workers; these are Java-stack sample fractions, not percentages of whole-job CPU. Native-method samples are recorded separately because they can include blocking. A separate OS sample resolves Rust Parquet push decoding, dictionary/RLE decoding and Arrow take code, without establishing a complete Rust CPU distribution. The profiles cover these three queries, not all 18 losses.

A follow-up unprofiled comparison disabled shuffle compression for both engines, then repeated the default setting with the same frozen runtime, three warmups and seven measured trials. Every trial passed the same result and execution checks.

Query Compression off: stock / native, ms Compression on: stock / native, ms
21 843.2 / 863.7 995.9 / 878.0
33 628.2 / 460.8 603.4 / 497.5
88 4,998.8 / 8,600.3 5,177.0 / 5,951.3

Disabling compression did not eliminate Q88's loss. The cohort order was fixed and the host shared, so these comparisons do not isolate compression's causal effect or identify the cause of the primary regressions. These diagnostic runs left defaults unchanged; the subsequent native LZ4 decoder is described above. Batch admission remains compatibility-based. Structured diagnostics retain every trial, ranges, runtime hashes, sampling counts and interpretation limits.

Archived evidence

Full plans, raw reports/logs, interrupted and unfavorable cohorts, source/runtime provenance, JFR recordings and the native sample are retained in the versioned evidence release. The SHA-256 manifest records the archive and every member. Generated datasets and build artifacts are excluded. This archive was downloaded independently and verified before local raw evidence was removed.

To restore verified evidence beneath an owned directory, from the repository root:

python3 - <<'PY'
from pathlib import Path
import sys
sys.path.insert(0, "dev")
from benchmark_artifacts import fetch
fetch(["docs/benchmarks/paimon-tpcds-20261114-evidence"],
      Path("/path/to/owned/evidence"), Path("/path/to/owned/cache"),
      Path("docs/benchmarks/results/paimon-tpcds-evidence-20261114.json"))
PY