sql - 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
解决方案
你过度优化了。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
推荐阅读
- sql - 如何在 SSMS 中备份或编写数据库的所有同义词?
- android - Kotlin SharedPreferences - 保存 ListView 项目并加载它们
- r - match.arg(opt_crit) 中的错误:“arg”必须为 NULL 或字符向量
- arrays - Excel maximum difference between consecutive values in array
- python - CondaValueError:目标前缀是基本前缀。中止
- oracle - 即使在 HP-U 的 mkmf 中使用 SYSHDRS,PROC 编译器 12.2 也无法识别头文件
- python - 如何修复“未找到 OU”
- android - 如何检查当前是否打开了任何活动
- asp.net-core - .NET Core 中的微服务架构:服务相互调用的模式或库
- python - 使用多索引列对数据进行切片