oracle update 和 臨時表的 弱處!

2021-08-24 19:44:32 字數 2570 閱讀 1625

曾經面試的時候有公司問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...