Флаг оптимизатора hash_join_cardinality
Флаг оптимизатора hash_join_cardinality был добавлен в MariaDB 11.0.2, MariaDB 10.11.3, MariaDB 10.10.4, MariaDB 10.9.6, MariaDB 10.8.8 и MariaDB 10.6.13.
В MySQL и MariaDB, выходная мощность части запроса исторически была связана с используемым(ими) методом(ами) доступа. Это отличается от подхода, используемого в учебниках по базам данных. Там мощность «x JOIN y» одинакова независимо от используемых методов доступа для ее вычисления.
Пример
Рассмотрим запрос, объединяющий клиентов со своими заказами:
select * from customer, orders, ... where customer.id = orders.customer_id and ...
Предположим, таблица заказов имеет индекс IDX по orders.customer_id.
Если план запроса использует этот индекс для извлечения заказов для каждого клиента, оптимизатор будет использовать статистику индекса из IDX для оценки количества строк в клиентах, объединенных с заказами.
С другой стороны, если оптимизатор рассматривает план запроса, который объединяет клиента с заказами без использования индексов, он полностью проигнорирует customer.id = orders.customer_id равенство и вычислит выходную мощность так, как если бы клиент был объединен с заказами перекрестным соединением.
Hash-соединение
MariaDB поддерживает Block Hash Join. По умолчанию он не включен, для его активации необходимо установить join_cache_level на 3 или большее значение.
До MDEV-30812, оптимизация запросов для Block Hash Join работала так, как описано в приведенном выше примере: она предполагала, что операция объединения является перекрестным соединением.
MDEV-30812 вводит новый флаг optimizer_switch, hash_join_cardinality. В версиях MariaDB до 11.0 он по умолчанию выключен.
Если его установить в ВКЛЮЧЕНО, оптимизатор будет использовать гистограммы столбцов при вычислении мощности выходных данных операции hash-соединения.
Вычисления можно увидеть в отслеживании оптимизатора, найдите hash_join_cardinality.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/hash_join_cardinality-optimizer_switch-flag/