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

       

Алгоритм антисоединения с учетом наличия неопределенных значений


Как показывает запрос Q24, в Q23 может быть устранена вложенность подзапроса с использованием NAAJ. Для представления NAAJ используется следующая нестандартная нотация: T1.x NA= T2.y, где T1 и T2 — левая и правая таблицы антисоединения с учетом наличия неопределенных значений соответственно.

Q24

SELECT T1.C FROM T1, T2 WHERE T1.x NA= T2.y AND T2.z > 10;

Поясним семантику NAAJ на примере Q24. NAAJ выполняется после вычисления всех предикатов фильтрации над правой таблицей. Поэтому, когда мы говорим о T2 в последующем объяснении, имеется в виду набор данных, полученный путем применения предиката T2.z > 10

к исходной таблице T2.

  1. Если T2 не содержит строк, то вернуть все строки T1 и завершить работу.

  2. Если любая строка T2 содержит неопределенные значения во всех столбцах, участвующих в условии NAAJ, то не возвращать никаких строк и завершить работу.

  3. Если строка T1 содержит неопределенные значения во всех столбцах, участвующих в условии NAAJ, то не возвращать эту строку.

  4. Для каждой строки T1, если условие NAAJ вычисляется в TRUE или UNKNOWN для какой-либо строки T2, то не возвращать эту строку T1; иначе вернуть эту строку T1.

Шаг 1 аналогичен соответствующему шагу обычного антиcоединения; т.е. если правая часть пуста, то возвращаются все строки левой части, включая те из них, которые содержат неопределенные значения в условии антисоединения. Отметим, что шаги 2 и 3 поглощаются шагом 4, но их явное наличие позволяет выполнить антисоединение более эффективно, если все столбцы соединения левой или правой строки содержат неопределенные значения. Шаг 4 существенно отличает NAAJ от обычного антисоединения. Тогда как в обычном антисоединении, если условие антисоединения вычисляется в UNKNOWN, то строка левой таблицы возвращается, в NAAJ она не возвращается. Далее будут представлены стратегии выполнения NAAJ. Для антисоединений с участием нескольких столбцов эти стратегии являются сложными, и мы проиллюстрируем их с использованием запроса Q25.

Q25

SELECT c1, c2, c3 FROM L WHERE (c1, c2, c3) <> ALL (SELECT c1, c2, c3 FROM R);



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