Раскрытие подзапросов

В зависимости от сложности SQL-запроса оптимизатор пытается преобразовать вложенные подзапросы в одноуровневые запросы.

Например,

 Исходная конструкция                  Оптимизированная конструкция
----------------------------------------------------------------------
 SELECT * FROM                         SELECT * FROM AUTO
 (SELECT * FROM AUTO WHERE MAKE        WHERE MAKE = 'FORD' AND
 ='FORD')                              MODEL LIKE '%V8%';
 WHERE MODEL LIKE '%V8%';

Это преобразование не выполняется для запросов:

  • с конструкциями GROUP BY и HAVING;

  • со сложными вариантами OUTER JOIN;

  • с внешними ссылками и функциями;

  • содержащих представление (VIEW). (Исключение составляют запросы, содержащие представления без фразы WHERE).

К разновидности этой оптимизации относится преобразование стандартной формы OUTER JOIN в ORACLE-подобную форму записи.

Например,

Исходная конструкция               Оптимизированная конструкция
---------------------------------------------------------------
SELECT * FROM PERSON               SELECT * FROM PERSON,AUTO
LEFT OUTER JOIN AUTO               WHERE PERSON.PERSONID =
ON PERSON.PERSONID =               AUTO.RERSONID(+)
AUTO.RERSONID                      AND NAME = 'KIM';
WHERE NAME = 'KIM';