做优化 最怕 遇到标量子查询了, 看到SQL 中 有标量子查询, 执行计划都不用看, 直接 干掉 标量子查询。 我再做优 化过程中 一看到标量 肯定第一步 就搞掉标量。
大多数情况下 遇到的是 等值 修改, 基本上都改掉了, 这下好了, 遇到不等值 标量了。 这下怎么改??
废话不多说了 上SQL:
select om.order_state, om.finish_date,
id, om.order_state,
(select count(*) from work_date wd
where wd.oc_date > to_char(om.CREATE_DATE, 'yyyymmdd')
and wd.oc_date <=to_char( nvl(finish_date, sysdate) , 'yyyymmdd')
and wd.work_date_flag = 1) run_dur,
om.limit_date
from OM_ORDER OM 。
其实看到的 比这个 要难看的多, 我在SQL上面 做了 精简, 如果等值的, 那好 就先分组, 再left join 关联 。 也有 先关联再分组的 这下好了 不等值。
哥想了一会 先想到的是 分析函数中 有个 可移动范围 算数据, 想想 应该不是, 因为这里的 范围不定, 根据每行的数据 变化而变化。
哥又想到了 先关联 在关联 。 于是着手写 SQL:
from OM_ORDER OM inner join (
select OM.rowid rid, count(*) run_dur from work_date wd inner join OM_ORDER OM on
wd.oc_date > to_char(om.CREATE_DATE, 'yyyymmdd')
and wd.oc_date <=to_char( nvl(finish_date, sysdate) , 'yyyymmdd')
and wd.work_date_flag = 1
group by OM.rowid
) on ( OM.rowid = rid);
这样 OM表扫描2次 , work_date 表扫描一次, 总比 标量中 OM表有多少条 扫描多少次 work_date 要好, 但是 实际 项目中 需要看两个表的体积。 哥这个算是改出来了吧, 小伙伴们 有没有更好的办法呢???
good day , good luck, good jop
---- 再次修改
select max(om.order_state) order_state, max(finish_date) finish_date , max(id) id, max(om.order_state) order_state, decode(count(*),1,0, count(*)) run_dur, max(limit_date) limit_date
from work_date wd right join OM_ORDER OM on
wd.oc_date > to_char(om.CREATE_DATE, 'yyyymmdd')
and wd.oc_date <=to_char( nvl(finish_date, sysdate) , 'yyyymmdd')
and wd.work_date_flag = 1
group by OM.rowid order by id ; 也满足