日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

以A表中的值快速更新B表中记录的方法

發布時間:2023/12/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 以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));

  • 制作模擬數據,A表插入10000行記錄,B表插入100000行記錄

    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、優化解決辦法

    ????常規辦法是逐條進行更新,那可不可以進行批量的更新呢?答案是肯定的。我們可以這樣操作。

  • 在A表的TBBH字段上創建主鍵約束

    alter table a add primary key (tbbh) using index;

  • 對A、B表的聯合視圖進行更新

    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表中记录的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。