Оптимизация сдвигом условия в производную таблицу
Если запрос использует производную таблицу (или представление), первой операцией, которую попытается выполнить оптимизатор запроса, будет применение оптимизации слияния производной таблицы и слияние производной таблицы с родительским запросом. Однако эта оптимизация применима только в том случае, когда запрос внутри производной таблицы имеет объединение в качестве операции верхнего уровня. Если используется оператор GROUP-BY, DISTINCT или применяются окна функций, то оптимизация слияния производной таблицы неприменима.
В этом случае применима оптимизация сдвигом условия.
Введение в сдвиг условия
Рассмотрим пример
create view OCT_TOTALS as select customer_id, SUM(amount) as TOTAL_AMT from orders where order_date BETWEEN '2017-10-01' and '2017-10-31' group by customer_id; select * from OCT_TOTALS where customer_id=1
Примитивный способ выполнения вышеприведенного запроса состоит в
- Вычислении содержимого OCT_TOTALS (для всех клиентов).
- Затем, выбор строки с customer_id=1
Это очевидно неэффективно, если есть 1000 клиентов, тогда одна строка будет выполнять до 1000 раз больше работы, чем необходимо.
Однако оптимизатор может взять условие customer_id=1 и сдвинуть его вниз в представление OCT_TOTALS.
(TODO: Разъяснить здесь)
Свойства сдвига условия
- Сдвиг условия доступен с MariaDB 10.2.
- Задача Jira для него была MDEV-9197.
- Оптимизация включена по умолчанию. Ее можно отключить, установив
@@optimizer_switchфлагcondition_pushdown_for_derivedв значение OFF.
См. также
- Сдвиг условия через окна функций (с MariaDB 10.3)
- Сдвиг условия в подзапросы IN (с MariaDB 10.4)
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/condition-pushdown-into-derived-table-optimization/