преобразует операцию над множествами INTERSECT
Правило 8. INTERSECT to Exists
Это правило (таб. 11) преобразует операцию над множествами INTERSECT (которая может быть n-арной) к запросу с квантором существования, который может быть впоследствии преобразован (через EtoF и SELMERGE) к одиночному блоку SELECT. Обычно в РСУБД операция INTERSECT выполняется путем сортировки операндов с последующим их слиянием. Этот метод выполнения является разновидностью соединения сортировкой со слиянием. Мы переписываем операцию INTERSECT как соединение и поэтому можем использовать методы соединения, отличные от сортировки со слиянием. Это может повысить эффективность на много порядков, и поэтому такое преобразование запросов является необходимым.
Таб. 11. Правило 8 – INT2EXIST
Напомним, что в SQL семантика операции INTERSECT заключается в том, что сначала в операндах удаляются дубликаты, и в результат попадает одна копия каждого кортежа, встречающегося во всех операндах. Это эквивалентно тому, что выбирается любой операнд, и в результат передается одна копия каждого его кортежа, встречающегося во всех других операндах. В данном правиле просто фиксируется эта эквивалентность – оно производит блок SELECT DISTINCT с одним F-квантификатором (произвольно выбранным операндом) и E-квантификаторами над всеми другими операндами, которые фильтруют кортежи источника F-квантификатора, не соответствующие всем другим источникам. Заметим, что для сопоставления кортежей в предикате подзапроса требуется большая конъюнкция – два кортежа соответствуют один другому, когда равны значения всех их столбцов.
В качестве примера рассмотрим следующий запрос, который находит пересечение множества изделий, обрабатываемых служащим 1279, и множества изделий, которые запланированы для обработки в рабочем центе WK195 на дату 9773.
Пример 5.
SELECT items FROM wor WHERE empno = 'EMPN1279' INTERSECT SELECT itemn FROM itl WHERE entry.tirne = '9773' AND wkctr = 'WK195';
Правило перезаписи для пересечения преобразует запрос в подзапрос с квантором существования, который, в свою очередь, преобразуется в соединение путем применения правила EtoF и сливается путем применения правила SELMERGE.Запрос после перезаписи выглядит следующим образом:
SELECT DISTINCT itemn FROM itl, wor WHERE empno = 'EMPN1279' AND entry time = '9773' AND wkctr = 'WK195' AND itl.itemn = wor.itemn;
Результата выполнения этого запроса с использованием перезаписи и без этого показаны в таб. 12. После преобразования к соединению оптимизатор планов учитывает возможность применения как метода соединения слиянием, так и метода вложенных циклов. По причине наличия индекса на столбце соединения itemn выбирается метод вложенных циклов, что намного повышает эффективность.
Таб. 12. Пример 5, до и после перезаписи
Содержание Назад Вперед