Oracle SQL WITH语句是否优于subselect

时间:2018-03-16 14:31:49

标签: sql oracle subquery common-table-expression query-performance

我有一个超过1000行的Oracle查询。打破它和/或使用存储过程不是一个选择。我即将更长时间。哪些具有更好的性能?我发现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      
  ;

1 个答案:

答案 0 :(得分:1)

我还发现CTE WITH表达式更容易阅读。除此之外,有理由更喜欢它。

  • 您可以在主查询中多次使用CTE子查询。
  • Oracle Optimizer可以将CTE子查询的结果存储在即时创建的临时表中。 (注意,您甚至可以通过未记录的提示/*+ MATERIALIZE */
  • 强制它
  • 您可以递归使用CTE,请参阅Recursive Subquery Factoring