Spec-Zone.ru › MariaDB

Оптимизация положений 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.

Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API