Optimize multiple COUNT(DISTINCT) memory via logical plan rewrite
- Lingua principale
- Rust
- Stelle
- 9.3k
- Fork
- 2.4k
- Merge medio
- 3g 11h
- PR unite (30g)
- 360
Descrizione
### Is your feature request related to a problem or challenge?
DataFusion's default execution creates separate HashSet accumulators for each distinct count per group. With high-cardinality data (eg sellers with 4,000+ distinct cities in an ecommerce dataset), this causes memory explosion.
### Describe the solution you'd like
DataFusion already optimizes the single shared distinct field case via SingleDistinctToGroupBy. This PR adds a conservative logical rewrite for multiple distinct COUNT(DISTINCT …) arguments by splitting work into per-distinct branches joined on the group keys, which reduces peak memory for eligible plans.
COUNT(DISTINCT x) must ignore NULL x; the rewrite applies x IS NOT NULL on each distinct branch before inner grouping so semantics stay aligned with count_distinct behavior.
### Describe alternatives you've considered
_No response_
### Additional context
_No response_
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Inizia individuando la riscrittura logica esistente SingleDistinctToGroupBy e i percorsi dell’optimizer per le espressioni raggruppate COUNT(DISTINCT ...). Analizza come i piani idonei con più DISTINCT potrebbero essere suddivisi in rami per ciascun DISTINCT, uniti sulle chiavi di raggruppamento, preservando il filtraggio IS NOT NULL richiesto. Il lavoro è completato quando i piani idonei riducono il picco di memoria degli accumulatori DISTINCT e COUNT(DISTINCT x) conserva la propria semantica di ignorare i NULL.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- rust, sql
- Ambito
- data-engineering, databases
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Tranquilla
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100