曾經面試的時候有公司問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 ...
) fwhere 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;
看到這裡就頭大了。
oracle update 和 臨時表的 弱處!
曾經面試的時候有公司問oracle 開發不足之處有哪些?當時不懂。最近才感受到,我想那就是update和臨時表的使用上。原本我要對乙個表生成統計資料 該錶的結構如下 周次,星期,商店,參觀人數,購買人數,參觀人次,購買人次。200928,星期一,店,30,5,45,6.雖然看起來很簡單,實際上每個人...
oracle update多表關聯
update a.a3 a.a3 b.b3 的問題 表a 結構 a1 a2 a3 表b 結構 b1,b2,b3 其中 a1 b1 為pk 切值相同 就是可以使用a1 b1 了.請問用sql 語句或過程該如何實現如下的功能?更新a 表的 a3 用a.a3 與b.b3之和更新.3 update a se...
oracle update太慢優化
tb e zw nrllb temp 量700225 gsm user 量109398337 優化前 兩種update 說明 gsm user是檢視存在gsm user id索引,tb e zw nrllb temp有user id索引,使用以下兩種方法都更新時間超5h 導致不能更新成功 1upda...