Порядок построения:
- запрос преобразуется в формулу реляционной алгебры;
- выполняется преобразование (оптимизация) этой формулы.
Оператор SELECT (без агрегирования, группирования и удаления дубликатов) может быть представлен так:
Π A (σF (R 1×...× Rn)), где
от R 1 до Rn - это декартово произведение отношений (таблиц), указанных за ключевым словом FROM;
σF - это селекция кортежей декартова произведения в соответствии с условием, указанным за ключевым словом WHERE;
Π A - это проекция селекции на множество атрибутов A, указанных за ключевым словом SELECT
В чём суть такой логической оптимизации? Сначала надо выполнить декартово произведение, потом селекцию, потом проекцию - всё по порядку скобок в этом выражении. Потому что если таблица имеет большой размер, то это выражение будет выполняться очень долго.
Пример: найти фамилии поставщиков, поставляющих детали с названием "винт".
ρ =(S, P, SP)
SELECT фамилия
FROM S, P, SP
WHERE P.название = 'винт' AND
S.номер_поставки = SP.номер_поставки AND
|
|
SP.номер_детали = P.номер_детали;
Πфамилия(σP. н="винт"∧ S. н−п= SP. н−п∧ SP. н−д= P. н−д(S × P × SP))
После преобразования и выделения подзапросов (как в описании, приведённом выше) получится выражение Π A (σF (Π Ai (σf 2(R 1))×...×Π An (σfn (Rn)))), которое можно представить в графическом виде - это и будет логический план выполнения запроса:
Получается, подзапросы можно выполнять параллельно, а это тоже уменьшает время выполнения всего запроса.
Пример:
Запрос найти значение остатков больше 1500 на счетах пользователя с кодом 3:
SELECT остаток
FROM R2
WHERE остаток > 1500 AND
номер_счёта IN(
SELECT номер_счёта
FROM R1
WHERE код_пользователя = 3
);
Этот запрос преобразуется сервером в неявном виде в формулу реляционной алгебры:
Πостаток(σR 2.о>1500∧ R 1.к−п=3∧ R 1.н− c = R 2.н−с(R 1× R 2))
Теперь оптимизируем:
=4Πостаток(σR 1.н− c = R 2.н−с(σR 2.о>1500∧ R 1.к−п=3(R 1× R 2)))=6
=Πостаток(σR 1.н− c = R 2.н−с(σR 1.к−п=3(R 1)× σR 2.о>1500(R 2)=5,2
=Πостаток(σR 1.н− c = R 2.н−с(Πостаток, R 1.н−с, R 2.н−с(σR 1.к−п=3(R 1)× σR 2.о>1500(R 2))=9
=Πостаток(σR 1.н− c = R 2.н−с(Π R 1.н−с(σR 1.к−п=3(R 1))×Π R 2.н−с,остаток(σR 2.о>1500(R 2))))
Полученное выражение - результат оптимизации. Можно построить логический план выполнения запроса.