Такой запрос называется корреляционным подзапросом.
ниже пример). Такой запрос называется корреляционным подзапросом. В принципе, корреляционный подзапрос должен вычисляться каждый раз перед тем, как родительский предикат корреляционного запроса может быть проверен для принятия или отклонения возможной строки. В качестве примера рассмотрим следующий запрос:
SELECT NAME FROM EMPLOYEE X WHERE SALARY > (SELECT SALARY FROM EMPLOYEE WHERE EMPLOYEE_NUMBER=X.MANAGER)
Здесь выбираются имена служащих, зарабатывающих больше своего менеджера. X идентифицирует блок запроса и отношение, которое предоставляет возможный кортеж для корреляции. Для каждого возможного кортежа блока запроса верхнего уровня для вычисления подзапроса используется значение столбца MANAGER. Результат подзапроса затем возвращается в предикат "SALARY >" для проверки принятия возможного кортежа.
Если корреляционный подзапрос не находится напрямую под блоком запроса, на который ссылается, а отделен от этого блока одним или несколькими промежуточными блоками, то вычисление корреляционного подзапроса должно быть произведено до вычисления самого высокого из промежуточных блоков. Например:
level 1 SELECT NAME FROM EMPLOYEE X WHERE SALARY > level 2 (SELECT SALARY FROM EMPLOYEE WHERE EMPLOYEE-NUMBER = level 3 (SELECT MANAGER FROM ERPLOYEE WHERE EMPLOYEE-NUMBER = X.MANAGER))
Здесь выбираются имена служащих, зарабатывающих больше менеджера своего менеджера. Как и раньше, для каждого возможного кортежа блока запроса уровня 1 значение столбца EMPLOYEE.MANAGER используется для вычисления блока запроса уровня 3. В этом случае, поскольку подзапрос уровня 3 ссылается на значение уровня 1, но не ссылается на значения уровня 2, он вычисляется по одному разу для каждого нового возможного кортежа уровня 1, а не для каждого возможного кортежа уровня 2.
Если значение, на которое ссылается корреляционный запрос (X.MANAGER в приведенном примере) не является уникальным во множестве возможных кортежей (например, у нескольких служащих может иметься один и тот же менеджер), описанная выше процедура все равно приведет к повторному вычислению подзапроса для каждого вхождения дублированного значения.Однако, если отношение, на которое ведет ссылка, упорядочено по столбцу, на который ссылается подзапрос, то повторное вычисление может быть условным в зависимости от проверки, не является ли текущее значение тем же самым, что и у предыдущего возможного кортежа. Если они одинаковы, предыдущее вычисленное значение может быть использовано снова. В некоторых случаях может иметь смысл даже специально отсортировать внешнее отношение по соответствующему столбцу, чтобы избежать излишнего вычисления подзапроса. Чтобы определить, являются ли уникальными значения столбца, на который ссылается корреляционный запрос, ОПТИМИЗАТОР может использовать подсказки типа NCARD > ICARD, где NCARD - мощность отношения, а ICARD - мощность индекса на этом столбце.
Содержание Назад Вперед