Лучше ли оператор Oracle SQL WITH, чем подзапрос?

У меня есть запрос Oracle длиной более 1000 строк. Разрушение и / или использование хранимых процедур здесь не вариант. Я собираюсь сделать это еще длиннее. Какой из них имеет лучшую производительность? Я считаю, что версию WITH легче читать.

  /* subselect */
  select col01
        ,col02
  from (
    select case col01 when 'X' then 1 else 2 end col01
          ,case col02 when 'Y' then 3 else 4 end col02
    from (      
      select upper(col01) col01
            ,upper(col02) col02
      from (      
        select 'x' as col01
              ,'y' as col02
        from dual
      )
    )
  )
  ;
  ---------------------------------------
  /* with statement */
  with qry01 as (
  select 'x' as col01
        ,'y' as col02
  from dual
  )
  ,qry02 as (
  select upper(col01) col01
        ,upper(col02) col02
  from qry01      
  )
  ,qry03 as (
  select case col01 when 'X' then 1 else 2 end col01
        ,case col02 when 'Y' then 3 else 4 end col02
  from qry02      
  )
  select col01
        ,col02
  from qry03      
  ;

Производительность должна быть практически такой же. Оптимизатор Oracle определяет лучший план запроса. Он может быть немного более гибким с CTE (позволяя материализацию), но это не имеет значения, если CTE упоминается только один раз.

Gordon Linoff 16.03.2018 15:33

Вы не можете определить производительность запроса, глядя на него или спрашивая в Интернете; единственный способ узнать наверняка - это проверить. Думаю, это тоже не ваши настоящие вопросы.

mustaccio 16.03.2018 15:37

Спасибо @mustaccio. Эта упрощенная версия очень упрощена. Я просто искал предложения, прежде чем потратить часы, чтобы преобразовать одно в другое.

AWhatley 16.03.2018 15:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
292
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я также считаю, что выражение CTE WITH легче читать. Кроме того, есть причины предпочесть его.

  • Вы можете использовать подзапросы CTE несколько раз в своем основном запросе.
  • Оптимизатор Oracle может сохранять результат подзапроса CTE во временной таблице, которая создается на лету. (Обратите внимание, вы даже можете принудительно использовать недокументированную подсказку /*+ MATERIALIZE */)
  • Вы можете использовать CTE рекурсивно, см. Рекурсивный факторинг подзапросов

Я считаю, что второй момент также верен для подзапроса без CTE.

trincot 16.03.2018 15:40

@trincot, не знаю, вроде бы не так понятно: Материализовать подзапрос без использования предложения with - не путайте "материализацию" с "запросом на слияние"

Wernfried Domscheit 16.03.2018 15:47

Я не говорю о принудительной части (не говоря уже о «запросе на слияние»), а о «Оптимизаторе Oracle может ...». Я верю, что может.

trincot 16.03.2018 15:52

Другие вопросы по теме