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

       

Оконные функции


В стандарте SQL 2003 [11] SQL расширяется оконными функциями, которые не только обеспечивают простые и изящные выразительные средства для формулировки аналитических запросов, но также могут способствовать эффективной оптимизации и выполнению запросов, позволяя избежать многочисленных самосоединений (self-join) и наличия нескольких блоков запроса. Оконные функции широко используются в ряде аналитических приложений. В Oracle оконные функции поддерживаются начиная с версии Oracle 8i. Синтаксис оконных функций выглядит следующим образом:

Window_Function ([arguments]) OVER ( [PARTITION BY pk1 [,pk2 , ...]] [ORDER BY ok1 [,ok2 , ...][WINDOW clause]])

Оконные функции вычисляются внутри разделов (partition), определяемых ключами pk1, pk2 и т.д. раздела PARTITION BY (PBY), над данными, упорядоченными внутри каждого раздела по значениями ключей ok1, ok2 и т.д. раздела ORDER BY (OBY). В разделе WINDOW определяется окно (window)

(начальная и конечная точки) для каждой строки. В качестве оконных функций могут использоваться агрегатные функции SQL (SUM, MIN, COUNT и т.д.), функции ранжирования (RANK, ROW_NUMBER и т.д.) или ссылочные функции (LAG, LEAD, FIRST_VALUE и т.д.). Детали синтаксиса и семантики оконных функций описаны в стандарте ANSI SQL [10] [11].

Оконные функции в блоке запроса вычисляются после разделов WHERE, GROUP BY и HAVING. Oracle вычисляет оконную функцию, сортируя данные по ключам разделов PBY и OBY и выполняя, если это требуется, проходы по отсортированным данным. Мы называем такой способ выполнения методом сортировки окна (window sort). Очевидно, что, если оконная функция не содержит ключей PBY и OBY, сортировка не требуется. В этом случае Oracle буферизирует данные, требуемые для вычисления оконной функции, и такой способ выполнения называется методом буферизации окна (window buffer).

Оценочный оптимизатор Oracle устраняет сортировку при оконных вычислениях, если выбирается план, производящий данные в порядке ключей PBY и OBY. В этом случае выполнение производится на основе буферизации окна, когда Oracle просто буферизирует данные и производит несколько проходов по ним для вычисления оконной функции. Однако если данные поступают упорядоченными, то для вычисления оконных функций типа RANK, ROW_NUMBER, кумулятивных (cumulative)(нарастающих) оконных агрегатов можно избежать и буферизации. Сохраняя некоторую информацию о контексте (значения оконной функции и ключей PBY), можно вычислить эти функции при обработке входных данных.



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