oralce 的兩個表關聯更新 寫法和另類 與MS SQL很不一樣
有時候更新大錶速度特慢 5-10個小時都沒結束
UPDATE T_BASE_SUCC_PROUSER X SET X.F_EXPECTENDDATE = ( SELECT
E.F_ENDTIME FROM T_GATHER_EXPECT E WHERE X.F_LOTID=E.F_LOTTERYID AND
X.F_EXPECT=E.F_EXPECT )
T_BASE_SUCC_PROUSER 昨天更新了14個小時都沒解釋
今天加個索引也跑那麼慢
首次載入時間 2009-9-8 10:38:5 到現在15:58分近五個小時了
而且EM上看IO量維持很低
表大小7205M 行7758,5575
執行計畫
操作 對象 物件類型 順序 行 大小 (KB) 成本 時間 (秒) CPU 成本 I/O 成本
TABLE ACCESS FULL T_BASE_SUCC_PROUSER TABLE 1 77585575 1,439,576.099 169053 2029 36788100922 164759
TABLE ACCESS FULL T_GATHER_EXPECT TABLE 2 1 0.021 139 2 25736801 136
想這樣更新大表 而且IO利用率那麼低 各位如何寫這樣更新語句啊
1
UPDATE T_BASE_SUCC_PROUSER X SET X.F_EXPECTENDDATE = ( SELECT
E.F_ENDTIME FROM T_GATHER_EXPECT E WHERE X.F_LOTID=E.F_LOTTERYID AND
X.F_EXPECT=E.F_EXPECT )
where exists(select 1 from T_GATHER_EXPECT E WHERE X.F_LOTID=E.F_LOTTERYID AND X.F_EXPECT=E.F_EXPECT)
後面一定要加上where exists(select 1 from T_GATHER_EXPECT E WHERE
X.F_LOTID=E.F_LOTTERYID AND X.F_EXPECT=E.F_EXPECT)
,不能的話所以的資料行都將修改,當然每行只是修改一次。
2
建議用Update視圖的方式來做。
update (select x.F_EXPECTENDDATE,E.F_ENDTIME
from T_BASE_SUCC_PROUSER X left join T_GATHER_EXPECT E on X.F_LOTID=E.F_LOTTERYID AND X.F_EXPECT=E.F_EXPECT
)
set F_EXPECTENDDATE=F_ENDTIME
兩表需要外鍵關鏈
3 暫存資料表法
create table a as
select x.*,e.f_endtime
from x
inner join e on x.f_lotid=e.f_lotid and e.id=x.id
truncate table x
insert into x select * from a;