Oracle中update執行效率的優化

2021-08-14 23:10:18 字數 1495 閱讀 3215

工作中經常遇到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資料表被鎖住。可以通過以下辦法解...