以A表中的值快速更新B表中记录的方法
1、問題描述
有兩張表,A表記錄了某些實體的新屬性,B表記錄了每個實體的舊屬性,現在打算用A中的屬性值去更新B中相同實體的舊屬性,如下圖所示:
類似這樣的需求,怎樣做比較高效呢?
2、制作模擬數據
????為了便于說明及進行效率對比,首先我們來制作一些模擬數據。在ORACLE數據庫中,模擬數據的制作分如下三步:
create table a (tbbh number,dlbm varchar2(3));
create table b (objectid number,tbbh number,dlbm varchar2(3));
insert into a select rownum tbbh ,dbms_random.string('U',3) from dual connect by level <10000;
insert into b select rownum objectid ,rownum tbbh ,dbms_random.string('U',3) from dual connect by level <100000;
commit;
3、常規解決辦法
????常規解決思路:從A表中每讀出一條記錄,去B表更新對應實體的屬性值。用一段存儲過程來模擬這個問題為:
????begin
????????for x in (select tbbh,dlbm from a)
????????????loop
????????????update b set b.dlbm=x.dlbm where b.tbbh=x.tbbh;
????????????end loop;
????????????commit;
end;
????在B表TBBH字段未創建索引的情況下,耗時約17.95s。
????在B表TBBH字段創建索引的情況下,耗時約1.18s。
4、優化解決辦法
????常規辦法是逐條進行更新,那可不可以進行批量的更新呢?答案是肯定的。我們可以這樣操作。
alter table a add primary key (tbbh) using index;
update (select b.tbbh ,a.dlbm adlbm ,b.dlbm bdlbm from a,b where a.tbbh=b.tbbh ) set bdlbm=adlbm;
?
使用該方法,在B表TBBH字段未創建索引的情況下,耗時約0.96s。
使用該方法,在B表TBBH字段創建索引的情況下,耗時約0.54s。
?
5、效率對比
| ? | B表TBBH無索引 | B表TBBH有索引 |
| 常規方法 | 17.95s | 1.18s |
| 優化方法 | 0.96s | 0.54s |
?
很顯然,優化后的方法,其性能有較大程度的提升。
轉載于:https://www.cnblogs.com/6yuhang/p/8544187.html
總結
以上是生活随笔為你收集整理的以A表中的值快速更新B表中记录的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解析PHP跳出循环的方法以及contin
- 下一篇: 企业级应用与互联网应用的区别