Классика баз данных - статьи

       

преобразует операцию над множествами 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, до и после перезаписи


Содержание  Назад  Вперед