oracle update 和 临时表的 弱处!

本文探讨了在Oracle数据库中生成周次、星期等时间序列,并结合商店数据进行统计汇总时遇到的问题及解决方案。作者尝试了直接插入与更新、使用临时表等方法,但都面临效率瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

曾经面试的时候有公司问ORACLE 开发不足之处有哪些? 当时不懂。最近才感受到,我想那就是UPDATE和临时表的使用上。

原本我要对一个表生成统计数据 该表的结构如下

周次,星期,商店,参观人数,购买人数,参观人次,购买人次。

200928,星期一,女装店,30,5,45,6.

虽然看起来很简单,实际上每个人数和人次都是个子查询而得来的数字。还有个问题就是有些店铺可以没有营业状态,那么其数字该为零。

也就说时间的生成 (周次,星期) 是不能依据店铺的营业时间为生成标准,得靠自然时间。从第一家店铺营业时间为起始点到统计的截止时间。

v_startday-->trunc(sysdate,'d') 然后采用循环插入进去

for i in 0..(v_endate-v_startday)

loop

insert into a

select to_char(v_currday,'yyyyiw'),to_char(v_currday,'day'), store_name, B.num,C.num,D.num,E.num

left join ( select b.num from ..... where open_day between v_currday and v_currday+1) on .....

left join ( select c.num from ..... where open_day between v_currday and v_currday+1) on .....

left join ( select d.num from ..... where open_day between v_currday and v_currday+1) on .....

left join ( select e.num from ..... where open_day between v_currday and v_currday+1) on .....

order by ......

end loop

速度超慢 而且IO量也好低 从10G的EM上 看一条

2 接着的办法是想到 先插入时间序列 然后在UPDATE 空值的数据。

for i in 0...(v_enddate-v_startday)

loop

insert into a (f_yeaweek,f_weekday)

values(to_char(v_currday,'yyyyiw'),to_char(v_currday,'day');

end loop;

update a

set (store_name,looknum,buynum,looks,buys) =

(

select f_yearweek,f_weekday,s.store_name,B.num,C.num,D.num,E.num

from

( select * from s

left join ( select count() from b where open_day between v_startdayand v_endate+1) on ...

left join ( select count() from b where open_day between v_startdayand v_endate+1) on ...

left join ( select count() from b where open_day between v_startdayand v_endate+1) on ...

left join ( select count() from b where open_day between v_startdayand v_endate+1) on ...

) F

where a.f_yearweek=f.f_yearweek and a.f_weekday= f.f_weekday

)

where a.f_yearweek between to_char(v_startday,'yyyyiw') and to_char(v_enddate,'yyyyiw')

;

结果同样的慢 从EM 图中看到 每更新次 都要执行次查询 虽然条件一样! 因为一次查询时间要5分钟。

3 想采用临时表。 先把时间数据插入到临时表 然后

insert into a

select *

from tmp

left jon ..

left jon ...

left jon....

问题是 ORACLE 临时表必须动态执行! 狂混啊! 不能像MS SQL样。

sql:="create ....tmep ...."

execute sql ;

for i in ....

loop

sql := '......'....'.... '; --动态参数赋值是个麻烦问题

exuecute sql;

end loop

sql:='

insert into a

select *

from tmp

left jon ..

left jon ...

left jon....

'

execute sql;

看到这里就头大了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值