tests/performance/array_join.xml query 6 has no sink, alone among the seven
queries of that file, so it returns all 45,000,000 result rows to the client:
540 MB on the wire, and 94-97% of its wall clock blocked in network send
(UserTimeMicroseconds 0.51 s of a 6.42 s run). That transfer is what its
7090 ms amd p50 measures, against 47-275 ms for queries 0-5 in the same file,
a documented ideal of 0.1-1 s and report.py's 2 s flag. Its tail also crosses
perf.py's 15 s per-run cap, and the resulting Code 159 ends the whole test file,
leaving the other six queries unmeasured. tests/performance/scripts/README.md:64-66
names the class, "a forgotten format Null".
Two settings are appended to that one query, nothing else changes:
format Null discards the result, so 540,088,942 bytes on the wire become 81
and the query goes from 6.479 s to 0.092 s.
enable_lazy_columns_replication = 0 keeps the benchmark on its subject. The
query uses the arrayJoin function form and query_plan_lower_array_join_function
is off by default, so the expansion runs in ExpressionActions, which wraps the
String passenger in a lazy ColumnReplicated; without the pin only 12.5% of the
run is spent in ColumnString::replicate (562 of 4752 sampled frames), with it
63% (2478 of 6100). array_join_filter_fusion.xml:26 pins the same setting for
the same reason, and the lazy path keeps its own coverage in five other perf
tests.
Measured with the master amd_release binary at the perf job's own configuration
(max_threads=8, 8 pinned physical cores, the perf users profile), a rig whose
medians sit within 11% of the shard's CIDB p50 on all seven queries of the file.
Through perf.py the file's run stage drops from 53.5 s to 8.4 s with all 7
queries measured. numbers(10000000), the projection and the expansion are
untouched, so the replicated volume is what it has been since 2024. Query 6's
measurement changes meaning, so its per-query history is incomparable across
this commit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>