Ottimizzare le clausole GROUP BY e DISTINCT nelle subquery

Una clausola DISTINCT e una GROUP BY senza HAVING non hanno significato nelle subquery IN/ALL/ANY/SOME/EXISTS. Il motivo è che IN/ALL/ANY/SOME/EXISTS verifica solo se una riga nella query esterna soddisfa certe condizioni, rispetto a una riga o tutte le righe nel risultato della subquery. Perciò non importa se la subquery restituisce righe duplicate oppure no - se la condizione è vera per una riga della subquery, allora sarà vera anche per i suoi duplicati. Si noti che GROUP BY senza HAVING equivale a DISTINCT.

MariaDB 5.3 e le versioni successive rimuovono automaticamente le DISTINCT e le GROUP BY senza HAVING, se queste appaiono in una subquery IN/ALL/ANY/SOME/EXISTS. Per esempio:

select * from t1
where t1.a > ALL(select distinct b from t2 where t2.c > 100)

Viene trasformata in:

select * from t1
where t1.a > ALL(select b from t2 where t2.c > 100)

Rimuovendo queste clausole non necessarie, l'ottimizzatore può determinare più efficientemente i piani di esecuzione delle query perché non deve preoccuparsi delle operazioni che avvengono dopo l'elaborazione dei risultati della subquery, dovute a DISTINCT / GROUP BY.

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.