【发布时间】:2018-03-16 14:31:48
【问题描述】:
我有一个超过 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
;
【问题讨论】:
-
性能应该基本相同。 Oracle 优化器确定最佳查询计划。使用 CTE(允许实现)可能会稍微灵活一些,但如果 CTE 只被引用一次,这无关紧要。
-
您无法通过查看或在互联网上询问来确定查询性能;唯一确定的方法是测试。我想这些也不是您的实际查询。
-
谢谢@mustaccio。这个简化的版本,很好地简化了。在花费数小时将其从一个转换为另一个之前,我只是在寻找建议。
标签: sql oracle subquery common-table-expression query-performance