Motivation
The 10M-row Q35 reproduction exposed two independent ownership failures:
ANALYZE TABLE could report success without publishing the refreshed optimizer statistics to existing CN sessions, leaving a stale local-aggregate + MergeGroup plan that spilled the complete high-NDV state;
- once hash shuffle was selected, VARCHAR ownership sampled a few byte positions, so common-prefix/sequential-suffix keys were distributed unevenly.
These require separate fixes. Missing NDV must not be treated as evidence of high NDV: forcing shuffle from an unknown estimate can materially regress low-cardinality workloads and is not part of the solution.
Reproduction evidence
Environment:
- host:
10.222.1.55
- 16 execution workers
- data and spill on NVMe
- 10,000,000 rows and 10,000,000 distinct VARCHAR URL values
Query:
SELECT 1, URL, COUNT(*) AS c
FROM hits
GROUP BY 1, URL
ORDER BY c DESC
LIMIT 10;
Stale statistics/plan state:
- no
shuffle: hash(URL);
- downstream
MergeGroup owned the global state;
- 10,000,000 rows / 575.89 MiB spilled;
- warm median 10.698s.
Fresh statistics selected hash shuffle and removed MergeGroup/spill, but legacy string ownership remained skewed:
- minimum groups per owner: 363,803;
- maximum groups per owner: 1,013,198;
- max/min ratio: 2.785x.
Required invariants
Statistics publication
- A successful
ANALYZE TABLE is a synchronous publication boundary on the affected CN.
- A later ordinary statement on that CN sees the published table statistics without reconnecting or restarting.
- Only plans/statistics that actually depend on the analyzed
(account, table) become stale.
- A compile or slow statistics read crossing publication cannot populate the new cache generation with old state.
- Failed, canceled, or missing refresh results do not invalidate usable cache entries.
- Same-table explicit and automatic refreshes cannot publish out of order.
- Process-lifetime metadata and admission state remain bounded.
String shuffle ownership
- Equal logical string keys map to exactly one owner during an execution.
- v32 ownership depends on the complete key and is deterministic across processes and CPU feature sets.
- v31 preserves the exact legacy mapping for mixed-version rollout and rollback.
- Common-prefix, common-suffix, sequential suffix, short/empty, UTF-8, and binary keys have bounded skew at DOP 1/2/8/16.
- The implementation is allocation-free per key; long-key work is explicitly linear in total bytes.
- Planner behavior for unknown NDV is unchanged.
IVF-FLAT boundary
- IVF-FLAT retains its existing full ObjectID ownership hash and does not use the new string-key protocol gate.
- IVF correctness, coverage, and warmed search performance must not regress.
Implementation split
Neither #27744 nor #27758 contains query text, schema name, URL shape, benchmark size, or issue-number conditions.
Latest validation
On the existing 10M-row NVMe data, twelve interleaved v31/v32 pairs measured:
| ownership |
median |
owner max/min |
max owner memory |
max group shard |
| v31 sampled |
0.514s |
2.785x |
137.53 MiB |
454ms |
| v32 complete |
0.544s |
1.005x |
109.58 MiB |
388ms |
The balanced mapping lowers maximum owner memory by about 20.3% and the slowest group shard by about 14.5%. The already non-spilling control pays about 5.8% wall-time for reading complete keys; this tradeoff is explicit rather than hidden.
Final commit bf1608d70e on the same host:
- patch
hits.URL statistics to NDV=1;
- connection
1732 compiles without hash shuffle;
- a second connection runs
ANALYZE TABLE hits(URL) successfully in 181ms;
- connection
1732, without reconnect/restart, immediately compiles with shuffle: hash(hits.url);
- execution has no
MergeGroup and no spill.
Version validation is allocation-free and measures about 47ns for one table, 56ns for four tables, and 131–136ns for sixteen tables. A zero-dependency cached plan takes a lock-free ~1.5ns path.
IVF-FLAT
The IVF implementation/ownership path is unchanged. A 50,000-row, 64-list index on the same host returns identical top-10 results and uses Vector Index Scan; the final #27758 binary measured 44.42ms median per 50 warmed searches versus 44.85ms before the change.
Test requirements
- deterministic, orthogonal unit tests with shared setup;
- no sleeps, million-row unit fixtures, or timing-only assertions;
- race repetition for publication/admission/cache boundaries;
- exact base/candidate statement coverage comparison;
- large scaling evidence remains an integration/benchmark check, not a unit test.
Related
Motivation
The 10M-row Q35 reproduction exposed two independent ownership failures:
ANALYZE TABLEcould report success without publishing the refreshed optimizer statistics to existing CN sessions, leaving a stale local-aggregate +MergeGroupplan that spilled the complete high-NDV state;These require separate fixes. Missing NDV must not be treated as evidence of high NDV: forcing shuffle from an unknown estimate can materially regress low-cardinality workloads and is not part of the solution.
Reproduction evidence
Environment:
10.222.1.55Query:
Stale statistics/plan state:
shuffle: hash(URL);MergeGroupowned the global state;Fresh statistics selected hash shuffle and removed
MergeGroup/spill, but legacy string ownership remained skewed:Required invariants
Statistics publication
ANALYZE TABLEis a synchronous publication boundary on the affected CN.(account, table)become stale.String shuffle ownership
IVF-FLAT boundary
Implementation split
ANALYZEstatistics publication only;Neither #27744 nor #27758 contains query text, schema name, URL shape, benchmark size, or issue-number conditions.
Latest validation
#27744 ownership
On the existing 10M-row NVMe data, twelve interleaved v31/v32 pairs measured:
The balanced mapping lowers maximum owner memory by about 20.3% and the slowest group shard by about 14.5%. The already non-spilling control pays about 5.8% wall-time for reading complete keys; this tradeoff is explicit rather than hidden.
#27758 publication
Final commit
bf1608d70eon the same host:hits.URLstatistics to NDV=1;1732compiles without hash shuffle;ANALYZE TABLE hits(URL)successfully in 181ms;1732, without reconnect/restart, immediately compiles withshuffle: hash(hits.url);MergeGroupand no spill.Version validation is allocation-free and measures about 47ns for one table, 56ns for four tables, and 131–136ns for sixteen tables. A zero-dependency cached plan takes a lock-free ~1.5ns path.
IVF-FLAT
The IVF implementation/ownership path is unchanged. A 50,000-row, 64-list index on the same host returns identical top-10 results and uses
Vector Index Scan; the final #27758 binary measured 44.42ms median per 50 warmed searches versus 44.85ms before the change.Test requirements
Related