工作中經常遇到update大表的時候執行效率很低,那麼怎樣才能讓oracle中update資料量比較大的表執行的更快呢?先看個簡單的例子吧:
需求是我們要將表intf_cms_calluser_tpye中的lant_id更新成cms.serv_base_msg表中的latn_id,關聯條件是intf_cms_calluser_tpye.object_id=cms.serv_base_msg.prod_id,目標表中intf_cms_calluser_tpye的資料量大概10w,源表cms.serv_base_msg資料量大概100多萬,首先寫個大家一般的更新方式;
update intf_cms_calluser_tpye t
set t.lant_id =
(select c.latn_id
from cms.serv_base_msg c
where c.prod_id = t.object_id)
where exists
(select 1 from cms.serv_base_msg where prod_id = t.object_id);
程式執行了大概半個多小時,更新成功;資料量不是很大,如果資料量更大的話大部分筒子應該不能接受,於是會有一部分人想到在object_id上建立索引,prod_id上已經存在索引,於是我們建立一下
create index idx_intf_cms_object_id on intf_cms_calluser_tpye(object_id) tablespace tbs_cms_inter_idx;
接著我們再來執行一下上述更新操作:
update intf_cms_calluser_tpye t
set t.lant_id =
(select c.latn_id
from cms.serv_base_msg c
where c.prod_id = t.object_id)
where exists
(select 1 from cms.serv_base_msg where prod_id = t.object_id);
結果不到5分鐘執行完畢,是不是已經很快了
如果你還是不滿意,接著我們繼續改寫
merge into intf_cms_calluser_tpye a --(目標表)
using cms.serv_base_msg b
on (a.object_id = b.prod_id)
when matched then
update set a.latn_id = b.latn_id;
執行一下,6秒鐘執行成功,這下大部分筒子應該都能接受吧
這個優化過程生產過程中很實用,但是要注意的是,建立索引是關鍵(在關聯欄位上的索引),merge的執行原理大家可以查閱相關資料去詳細了解一下,我的博文也有相關的介紹。另外不同的oracle版本merge的寫法支援程度不一樣,9i之前的版本是不支援merge的,9i才引入merge,但是9i版本是不支援單獨的update的,必須要有insert的寫法才算完整。
Oracle中執行update語句時卡住的解決方法
解決辦法 1.下面的語句用來查詢哪些物件被鎖 select object name,machine,s.sid,s.serial from v locked object l,dba objects o v session s where l.object id o.object id and l....
Oracle中執行update語句時卡住了
今天在執行下列語句時突然就卡住了 update t properties set content1 starttime 2012 12 12 00 00 00 id 750 permoney 1100 permember 20 firstprizeprobability 5 endtime 2012...
oracle執行update時卡死問題解決
oracle執行update時卡死問題解決 用sql進行更新資料庫操作時,eclipse沒有執行結束,也沒有報錯,debug時停留在執行sql語句的位置。用plsql developer 直接update這個語句也是一直執行,沒有結束。google問了下,oracle資料表被鎖住。可以通過以下辦法解...