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

       

Некоррелированный поглощаемый подзапрос


Рассмотрим запрос Q17, являющийся упрощенной версией запроса 15 тестового набора TPC-H. В Q17 имеется агрегатный подзапрос, в котором отсутствует корреляция с внешним запросом, и в подзапросе используется общее с внешним запросом представление (производная таблица) с группировкой V.

Q17

WITH V AS (SELECT l_suppkey, SUM(l_extprice) revenue FROM lineitem WHERE l_shipdate >= '1996-01-01' GROUP BY l_suppkey)

SELECT s_suppkey, s_name, V.revenue FROM supplier, V WHERE s_suppkey = V.l_suppkey AND V.revenue = (SELECT MAX(V.revenue) FROM V);

Этот запрос может быть преобразован в запрос Q18, в котором вводится оконная функция и удаляется подзапрос.

Q18

SELECT s_suppkey, s_name, V.revenue FROM supplier, (SELECT l_suppkey, SUM(l_extprice) revenue, MAX(SUM(l_extprice)) OVER () gt_rev FROM lineitem WHERE l_shipdate >= '1996-01-01' GROUP BY l_suppkey) V WHERE s_suppkey = V.l_suppkey AND V.revenue = V.gt_rev;

В этом примере для удаления подзапроса вводится оконная функция общего итога MAX (специфицируемая с использованием пустого раздела OVER( ) ) на агрегате SUM(l_extprice). Потребность в наличии в оконной функции раздела PBY отсутствует, так как в подзапросе из Q17 отсутствует корреляция, и его требуется применять ко всему множеству строк. Мы используем новый метод распараллеливания оконных функций общего итога, описываемый в разд. 5, так что преобразованный запрос Q18 может быть выполнен эффективным и масштабируемым образом.



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