首页 > 解决方案 > Oracle 案例陈述和效率

问题描述

我有一块我需要优化的 Oracle 查询

select
case 
    when SUM(dnl.quantity) = line.quantity then 1 
    when SUM(dnl.quantity) < line.quantity then 0 
    when SUM(dnl.quantity) > line.quantity then 2 
end
from mytable dnl

line.quantity 来自查询的其他部分,因为我认为不需要此示例。我只想计算一次 SUM(dnl.quantity) 而不是广告每个迭代,有些人认为

select
case SUM(dnl.quantity)
    when line.quantity then 1 
    when < line.quantity then 0 
    when > line.quantity then 2 
end
from mytable dnl

但显然这会在第二次和第三次 WHEN

标签: sqloracle

解决方案


你过度优化了。Oracle 编译器可以决定它要评估多少次sum(dnl.quantity)。但是,数据移动通常比计算单个列上的聚合要昂贵得多。

也就是说,如果您真的对此感到担忧,可以使用sign()

(case sign(sum(dnl.quantity) - line_quantity)
     when 0 then 1 
     when -1 then 0 
     when 1 then 2 
 end)

或者更难以理解:

sign(sum(dnl.quantity) - line_quantity) + 1

推荐阅读