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

       

Подзапросы, возвращающие мультимножества


Чтобы можно было удалить подзапроса с использованием оконных функций, этот подзапрос не обязательно должен содержать агрегатные функции и возвращать множество из одной строки. Рассмотрим запрос Q21, в котором подзапрос производит мультимножество строкй и участвует в квантифицированном предикате с квантором ALL.

Q21

SELECT ps_partkey, s_name, SUM(ps_supplycost * ps_availqty) AS value FROM partsupp, supplier, nation WHERE ps_suppkey = s_suppkey AND s_nationkey = n_nationkey AND n_name = 'GERMANY' GROUP BY s_name, ps_partkey HAVING SUM(ps_supplycost * ps_availqty) > ALL (SELECT ps_supplycost * ps_availqty * 0,01 FROM partsupp, supplier, nation WHERE n_name = 'GERMANY' AND ps_suppkey = s_suppkey AND s_nationkey = n_nationkey);

Этот запрос преобразуется в запрос Q22:

Q22

SELECT ps_partkey, s_name, VALUE FROM (SELECT ps_partkey, s_name SUM(ps_supplycost * ps_availqty) as VALUE, MAX(MAX(ps_supplycost * ps_availqty)) OVER () VAL_pkey FROM partsupp, supplier, nation WHERE n_name = 'GERMANY' AND ps_suppkey = s_suppkey AND s_nationkey = n_nationkey GROUP BY s_name, ps_partkey) V WHERE V.value > V.Val_pkey * 0,01;

Если бы в предикате подзапроса использовалось квантифицированное сравнение "> ANY", то оконная функция имела бы вид MIN(MIN(ps_supplycost * ps_availqty)) OVER (). Используя несколько оконных функций, можно аналогичным образом справиться с предикатами "= ALL" и "= ANY".



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