Расширенная оптимизация подзапросов в Oracle

       

Сращивание подзапросов одинакового типа


Если два конъюнктивных подзапроса с EXISTS или два дизъюнктивных подзапроса с NOT EXISTS

отвечают свойству включения, то они могут быть срощены в один подзапрос путем сохранения включаемого подзапроса и удаления включающего подзапроса. Для случая дизъюнктивных подзапросов с EXISTS или конъюнктивных подзапросов с NOT EXISTS сращивание может быть выполнено путем сохранения включающего подзапроса и удаления включаемого подзапроса.

Подзапросы, не отвечающие свойству совместимости, также могут быть срощены, если они являются почти эквивалентными, не считая наличия некоторого конъюнктивного фильтра и коррелированных предикатов. Например, два дизъюнктивных подзапроса с EXISTS, различающихся конъюнктивными предикатами фильтрации и коррелированными предикатами, но в остальном эквивалентные, могут быть срощены в один подзапрос с EXISTS, содержащий дизъюнкцию дополнительных (или различающимихся) предикатов исходных подзапросов. Конъюнктивные подзапросы с NOT EXISTS могут быть срощены аналогичным образом.

Рассмотрим запрос Q2 с двумя дизъюнктивными подзапросами с EXISTS; подзапросы содержат один и тот же коррелированный предикат, но разные конъюнктивные предикаты фильтрации:

Q2

SELECT o_orderpriority, COUNT(*) FROM orders WHERE o_orderdate >= '1993-07-01' AND EXISTS (SELECT * FROM lineitem WHERE l_orderkey = o_orderkey AND l_returnflag = 'R') OR EXISTS (SELECT * FROM lineitem WHERE l_orderkey = o_orderkey AND l_receipt_date > l_commitdate) GROUP BY o_orderpriority;

Сращивание подзапросов объединяет два подзапроса с EXISTS в один подзапрос с EXISTS

с дизъюнкцией предикатов фильтрации, что приводит к получению запроса Q3.

Q3

SELECT o_orderpriority, COUNT(*) FROM orders WHERE o_orderdate >= '1993-07-01' AND EXISTS (SELECT * FROM lineitem WHERE l_orderkey = o_orderkey AND (l_returnflag = 'R' OR l_receipt_date > l_commitdate)) GROUP BY o_orderpriority;



Содержание раздела