oracleupdate優(yōu)化

一、         update語(yǔ)句的語(yǔ)法與原理

站在用戶的角度思考問題,與客戶深入溝通,找到利通網(wǎng)站設(shè)計(jì)與利通網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋利通地區(qū)。

1.     語(yǔ)法

單表:UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值

如:update t_join_situation set join_state='1'whereyear='2011'

更新年度為“2011”的數(shù)據(jù)的join_state字段為“1”。如果更新的字段加了索引,更新時(shí)會(huì)重建索引,更新效率會(huì)慢。

   多表關(guān)聯(lián),并把一個(gè)表的字段值更新到另一個(gè)表中的字段去:

update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)  

oracle的更新語(yǔ)句不通MSSQL那么簡(jiǎn)單易寫,就算寫出來了,但執(zhí)行時(shí)可能會(huì)報(bào)

這是由于set哪里的子查詢查出了多行數(shù)據(jù)值,oracle規(guī)定一對(duì)一更新數(shù)據(jù),所以提示出錯(cuò)。要解決這樣必須保證查出來的值一一對(duì)應(yīng)。

2.     原理

Update語(yǔ)句的原理是先根據(jù)where條件查到數(shù)據(jù)后,如果set中有子查詢,則執(zhí)行子查詢把值查出來賦給更新的字段,執(zhí)行更新。

如:update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)。查表a的所有數(shù)據(jù),循環(huán)每條數(shù)據(jù),驗(yàn)證該條數(shù)據(jù)是否符合exists(select 1 from 表b where  a.字段2=b.字段2)條件,如果是則執(zhí)行(select b.字段1 from 表b where a.字段2=b.字段2)查詢,查到對(duì)應(yīng)的值更新a.字段1中。關(guān)聯(lián)表更新時(shí)一定要有exists(select 1 from 表b where a.字段2=b.字段2)這樣的條件,否則將表a的其他數(shù)據(jù)的字段1更新為null值。

二、         提高oracle更新效率的各種解決方案

1.     標(biāo)準(zhǔn)update語(yǔ)法

當(dāng)你需要更新的表是單個(gè)或者被更新的字段不需要關(guān)聯(lián)其他表帶過來,則最后選擇標(biāo)準(zhǔn)的update語(yǔ)句,速度最快,穩(wěn)定性最好,并返回影響條數(shù)。如果where條件中的字段加上索引,那么更新效率就更高。但對(duì)需要關(guān)聯(lián)表更新字段時(shí),update的效率就非常差。

2.     inline view更新法

inline view更新法就是更新一個(gè)臨時(shí)建立的視圖。如:update (select a.join_state as join_state_a,b.join_state asjoin_state_b

from t_join_situation a, t_people_info b where a.people_number=b.people_number

and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') set join_state_a=join_state_b

括號(hào)里通過關(guān)聯(lián)兩表建立一個(gè)視圖,set中設(shè)置好更新的字段。這個(gè)解決方法比寫法較直觀且執(zhí)行速度快。但表B的主鍵一定要在where條件中,并且是以“=”來關(guān)聯(lián)被更新表,否則報(bào)一下錯(cuò)誤:

 

3.merge更新法

merge是oracle特有的語(yǔ)句,語(yǔ)法如下:

MERGE INTO table_name alias1 
USING (table|view|sub_query) alias2
ON (join condition) 
WHEN MATCHED THEN 
    UPDATE table_name 
    SET col1 = col_val1, 
        col2     = col2_val 
WHEN NOT MATCHED THEN 
    INSERT (column_list) VALUES (column_values); 

它的原理是在alias2中Select出來的數(shù)據(jù),每一條都跟alias1進(jìn)行 ON (join condition)的比較,如果匹配,就進(jìn)行更新的操作(Update),如果不匹配,就進(jìn)行插入操作(Insert)。執(zhí)行merge不會(huì)返回影響的行數(shù)。Merge語(yǔ)句的寫法比較繁瑣,并且最多只能兩個(gè)表關(guān)聯(lián),復(fù)雜的語(yǔ)句用merge更新法將力不從心且效率差。

4.快速游標(biāo)更新法

語(yǔ)法如:

begin

for cr in (查詢語(yǔ)句) loop –-循環(huán)

   --更新語(yǔ)句(根據(jù)查詢出來的結(jié)果集合)

endloop; --結(jié)束循環(huán)

end;

oracle支持快速游標(biāo),不需要定義直接把游標(biāo)寫到for循環(huán)中,這樣就方便了我們批量更新數(shù)據(jù)。再加上oracle的rowid物理字段(oracle默認(rèn)給每個(gè)表都有rowid這個(gè)字段,并且是唯一索引),可以快速定位到要更新的記錄上。

例子如下:

begin

for cr in (select a.rowid,b.join_state from t_join_situation a,t_people_info b

where a.people_number=b.people_number

and a.year='2011'and a.city_number='M00000'and a.town_number='M51000') loop

update t_join_situation set join_state=cr.join_state where

rowid = cr.rowid;

endloop;

end;

使用快速游標(biāo)的好處很多,可以支持復(fù)雜的查詢語(yǔ)句,更新準(zhǔn)確,無論數(shù)據(jù)多大更新效率仍然高,但執(zhí)行后不返回影響行數(shù)。

結(jié)論

標(biāo)準(zhǔn)update語(yǔ)法

單表更新或較簡(jiǎn)單的語(yǔ)句采用使用此方案更優(yōu)。

inline view更新法

兩表關(guān)聯(lián)且被更新表通過關(guān)聯(lián)表主鍵關(guān)聯(lián)的,采用此方案更優(yōu)。

merge更新法

兩表關(guān)聯(lián)且被更新表不是通過關(guān)聯(lián)表主鍵關(guān)聯(lián)的,采用此方案更優(yōu)。

快速游標(biāo)更新法

多表關(guān)聯(lián)且邏輯復(fù)雜的,采用此方案更優(yōu)。

分享文章:oracleupdate優(yōu)化
文章位置:http://muchs.cn/article6/jsojig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、自適應(yīng)網(wǎng)站、企業(yè)網(wǎng)站制作標(biāo)簽優(yōu)化、做網(wǎng)站微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)