Семантическая оптимизация запросов СУБД — процесс валидации и преобразования синтаксического дерева запроса в форму, пригодную для дальнейших шагов оптимизации.
На этой стадии выполняется:
Запросы приводятся в каноническую форму, то есть переписываются так, чтобы они содержали минимальное количество операторов SELECT (соединение-фильтрация-проекция). Везде, где возможно, запрос должен быть приведен к форме единственного оператора SELECT. Это может позволить последующим фазам оптимизации сгенерировать значительно более эффективный (на 2-3 порядка) план выполнения для сложных запросов.
Раскрытие представлений применяется для того, чтобы итоговый запрос содержал ссылки только на материализованные отношения (таблицы) и было возможным использовать конвейерную обработку данных.
Исходный запрос | Результат |
---|---|
( T where cond1 ) where cond2 | T where ( cond1 and cond2) |
Преобразование подзапросов в соединения необходимо для применения конвейерной обработки данных и минимизации объема результатов подзапросов, аккумулируемых во временной дисковой или в оперативной памяти.
Исходный запрос | Результат |
---|---|
select distinct T.a from T
where T.b in ( select T1.b from T1 where T1.c < T.c) |
select distinct T.a
from T,T1 where T.b = T1.b and T1.c < T.c |
Исходный запрос | Результат |
---|---|
( A join B) where condA and condB | (A where condA) join (B where condB) |
Выполняется путём преобразования дерева логических операций в КНФ и упрощения полученной логической функции.
Преобразования дерева логических операций в КНФ выполняется следующим образом:
P OR (Q AND R) = (P OR Q) AND (P OR R) (P AND Q) OR R = (P OR R) AND (Q OR R)
NOT (P OR Q) = NOT P AND NOT Q
Преобразование продолжается рекурсивно до тех пор, пока дерево не будет состоять из конъюнкций конституэнт 0.
Полученная логическая функция находится в конъюнктивной нормальной форме, но избыточна. Для упрощения применяют методы оптимизации логических функций, такие как Эспрессо (Логика) или Куайна-Мак-Класки.
Распределение предикатов выполняется
A.B pred C
для которых существует предикат
A.B = D.E
В результате получаем предикат
D.B pred C
где C — константа; A,D — отношения; B,E — сравниваемые атрибуты. Данное упрощение выполняется на основе предположения, что исходный предикат A.B pred C может быть эффективней для отношения D.
A.B pred D.E
генерируется обратное условие
D.E inversed pred A.B
для возможности выполнить соединение в обратном порядке.
После упрощения дерева условий каждая конъюнкция в дереве представляет собой путь выборки. Предикаты внутри конъюнкций группируются по принадлежности к отношениям. Для получения итогового результата необходимо объединить результаты каждого из путей выборки.
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .