Оптимизация положений GROUP BY и DISTINCT в подзапросах
Оператор DISTINCT и оператор GROUP BY без соответствующего оператора HAVING не имеют смысла в подзапросах IN/ALL/ANY/SOME/EXISTS. Причина в том, что IN/ALL/ANY/SOME/EXISTS проверяют только, удовлетворяет ли внешняя строка некоторому условию относительно всех или любой строки в результате подзапроса. Поэтому не имеет значения, содержит ли подзапрос дубликаты строк результата или нет — если некоторое условие выполняется для какой-либо строки подзапроса, это условие будет выполняться и для всех дубликатов этой строки. Обратите внимание, что GROUP BY без соответствующего HAVING эквивалентен DISTINCT.
MariaDB 5.3 и более поздние версии автоматически удаляют DISTINCT и GROUP BY без HAVING, если эти операторы встречаются в подзапросе IN/ALL/ANY/SOME/EXISTS. Например:
select * from t1 where t1.a > ALL(select distinct b from t2 where t2.c > 100)
преобразуется в:
select * from t1 where t1.a > ALL(select b from t2 where t2.c > 100)
Удаление этих ненужных положений позволяет оптимизатору найти более эффективные планы запросов, так как ему не нужно обрабатывать результат подзапроса для удовлетворения DISTINCT/GROUP BY.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/optimizing-group-by/