Основные компоненты
В преобразованиях, основанных на стоимости, логические преобразования и физическая оптимизация объединяются для генерации оптимального плана выполнения. Это поясняется на рис. 1.
Рис. 1. Обработка запроса в Oracle
Можно считать, что логическое преобразование имеет два отдельных компонента: преобразования, основанные на эвристике и на стоимости. Инфраструктура (framework) преобразований, основанных на оценке стоимости, включает в себя следующее:
- алгоритмы преобразований, переводящие полное или частичное дерево запроса в семантически эквивалентную форму;
- пространство состояний различных преобразований;
- алгоритмы поиска в пространстве состояний;
- возможность глубокого копирования (deep copy) блоков запроса и их составных частей;
- техника оценки стоимости (физический оптимизатор);
- директивы преобразований и аннотации стоимости.
К разных элементам дерева запроса применяются разные преобразования. Например, к подзапросам и представлениям применяются устранение вложенности и слияние представлений соответственно, к узлам графа соединения применяется размещение группировки. К дорогостоящим предикатам применяется преобразование "вытягивание предиката".
Во время оптимизации дерево запроса обходится в восходящем стиле. Различные варианты использования одного или более преобразований элементов дерева запроса образуют различные состояния пространства состояний преобразования. Перед применением отдельного состояния и оценкой его стоимости путем вызова физического оптимизатора выполняется глубкое копирование (частичного) дерева запроса. Для применения каждого состояния обычно требуются различные копии (частичного) дерева запроса. Выбирается состояние преобразования, порождающее наиболее оптимальный план (т.е. наилучшее состояние), и директивы наилучшего состояния передаются исходному дереву запроса, которое преобразовывается в соответствии с этими директивами.
В Oracle преобразования обычно применяются последовательно, то есть каждое преобразование применяется ко всему дереву запроса, затем применяется другое преобразование, и так далее. Для некоторых преобразований соблюдается следующая последовательность их применения:
-
общая факторизация подвыражений (common sub-expression factorization),
слияние представлений "селекция-проекция-соединение" (SPJ view merging),- устранение соединений (join elimination),
устранение вложенности подзапросов (subquery unnesting),- слияние представлений с группировкой (group-by (distinct) view merging),
упрощение группировки (group pruning),- перемещение предикатов (predicate move around),
- преобразование операций над множествами в соединения (set operator into join),
размещение группировки (group-by placement),- вытягивание предиката (predicate pullup),
- факторизация соединений (join factorization),
- преобразование дизъюнкции в объединение (disjunction into union-all),
- преобразование "звезда" (star transformation),
- и проталкивание предикатов соединения (join predicate pushdown).
Однако имеются случаи, когда последовательность преобразований не соблюдается. Преобразования могут образовывать конструкции, которые могут повлечь за собой повторение других преобразований, например, преобразование операций над множествами в соединения может образовать SPJ-представление (селекция-проекция-соединение), и, следовательно, могут снова применяться слияние представлений SPJ и проталкивание предикатов фильтрации (filter predicate pushdown). Некоторые преобразования взаимодействуют друг с другом и должны рассматриваться вместе, чтобы можно было принять правильное решение, основанное на оценке стоимости; это обсуждается в подразделе 3.3.
Содержание раздела