Удаление подзапросов c использованием оконных функций
Этот метод позволяет заменять подзапросы оконными функциями[11], сокращая, тем самым, число сканирований таблицы и соединений, что способствует повышению производительности запроса. Некоторые из обсуждаемых методов удаления подзапросов были внедрены в Oracle 9i, некоторые были опубликованы в литературе [13]. В упрощенной форме рассматриваемый метод удаляет поглощаемые (subsumed) агрегированные подзапросы c использованием оконных функций.
Говорят, что внешний блок запроса поглощает (subsume) некоторый подзапрос, если он содержит все таблицы и предикаты, встречающиеся в этом подзапросе. Внешний блок запроса может содержать дополнительные таблицы и предикаты. Очевидно, что свойство поглощения (subsumption) отличается от свойства включения (containment), обсуждавшегося в разд. 2. Кроме того, в этом методе используются свойство соединения без потерь (lossless) и алгебраические агрегаты (например, SUM, MIN, MAX, COUNT, AVG и т.д.).
Q12 является примером запроса с поглощаемым агрегатным подзапросом, для которого применимо преобразование удаления подзапроса. T1 и T2 могут быть базовыми или производными таблицами, а также могут представлять собой соединение нескольких таблиц. Агрегат AGG подзапроса участвует в операции реляционного сравнения (relop) со столбцом T2.z внешнего запроса; корреляция в подзапросе происходит по столбцу T1.y.
Q12
SELECT T1.x FROM T1, T2 WHERE T1.y = T2.y and T2.z relop (SELECT AGG(T2.w) FROM T2 WHERE T2.y = T1.y);
Если предположить, что соединение T1 и T2 является соединением без потерь, в котором T2.y — это внешний ключ, ссылающийся на первичный ключ T1.y, то подзапрос может быть удален путем за счет введения оконной функции, в которой ключом раздела PARTITION BY служит столбец корреляции. Это демонстрируется в запросе Q13.
Q13
SELECT V.x FROM (SELECT T1.x, T2.z, AGG(T2.w) OVER (PARTITION BY T2.y) AS win_agg FROM T1, T2 WHERE T1.y = T2.y) V WHERE V.z relop win_agg;
Чтобы иметь возможность удалить подзапрос с использованием оконной функции, соединение между T1 и T2 не обязательно должно быть соединением без потерь. Однако наличие этого свойства приводит к преобразованиям, позволяющим оптимизатору использовать большее число перестановок соединений.
С использованием метода удаления подзапросов могут быть преобразованы различные варианты запросов вида Q12, в частности, варианты с некоррелированным подзапросом, с наличием дополнительных таблиц и предикатов, с отсутствием агрегатов, с наличием группировки в подзапросе и внешнем запросе. Примеры таких преобразований приводятся в последующих подразделах.