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

       

Гарантирование слияния подзапросов с квантором существования


Правила предыдущего раздела гарантируют, что блоки SELECT сливаются, когда единственными квантификаторами над нижним блоком являются F-квантификаторы. Следующее правило способствует слиянию путем создания этой ситуации настолько часто, насколько это возможно. В частности, мы увидим, что следующее правило гарантирует слияние конъюнктов подзапросов с квантором существования и вышестоящих блоков SELECT.

Правило 7. E to F Quantifier Conversion (преобразование E-квантификатора в F-квантификатор)

В этом правиле (таб. 9) мы преобразуем подзапросы с квантором существования булевских сомножителей в табличные выражения путем изменения типа квантификатора над этим подзапросом с E на F. Заметим, что правило ADDKEYS гарантирует, что условие этого правила, в конце концов, будет удовлетворено для всех таких подзапросов. Как отмечалось выше, преобразование подзапроса в табличное выражение (и, следовательно, в ряд соединений) увеличивает число возможных порядков выполнения соединений. Это может также позволить выполнять дополнительные слияния, если подзапрос является еще одним блоком SELECT.

Таб. 9. Правило 7 – EtoF

Это правило является QGM-эквивалентом правила, корректность которого доказана в [Day87]. Мы не доказываем здесь его корректность, но интуитивно ее можно увидеть путем рассмотрения случая с двумя квантификаторами. В качестве примера рассмотрим следующий запрос, выдающий информацию о заказах для изделий, которые произведены в определенных местоположениях и обрабатываются определенными рабочими центрами. Заметим, что у таблицы itp имеется ключ и, следовательно, в ней не содержатся дубликаты.

Пример 4.

SELECT * FROM itp WHERE itp.itemn IN (SELECT itl.itemn FROM itl WHERE itl.wkcen = 'WK468' AND itl.locan = 'LOCA000IN');

Чтобы выполнить этот запрос, мы должны вывести в результат одну копию кортежа из itp в том и только в том случае, когда в результате подзапроса имеется, по крайней мере, один кортеж, удовлетворяющий соответствующему предикату. Если мы применим DISTPU для преобразования подзапроса в табличное выражение, а затем применим SELMERGE, мы получим запрос с единственной операцией SELECT:



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