<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    夢幻之旅

    DEBUG - 天道酬勤

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

    在大型的數據庫應用中,我們經常會有針對表與表之間的關鍵建進行字段更新,那么在這個時候,我們就不能寫簡單的update來實現更新操作,而要針對具體的數據量來進行批量的update,下面幾個例子是常用的SQL,將其做個對比,歡迎大家提出更好,更高效的SQL實現。


    數據庫:Oracle 9i  測試工具:PL/SQL

    定義2張測試表:T1,T2
    T1--大表 10000條 T1_FK_ID
    T2--小表 5000條  T2_PK_ID
    T1通過表中字段ID與T2的主鍵ID關聯


    模擬數據如下:

    --T2有5000條記錄
    create table T2 as select rownum id, a.* from all_objects a where 1=0;
    //T2表的字段和all_objects表字段類型以及默認值一致,但索引初始化了,需要重新設置

    --創建主鍵ID,向T2表copy數據
    alter table T2 add constraint T2_PK_ID primary key (ID);
    insert into T2 select rownum id, a.* from all_objects a where rownum<=5000;
     
    --T1有10000條記錄          
    create table T1 as select rownum sid, T2.* from T2 where 1=0;

    -- 創建外鍵ID,向T1表copy數據
    alter table T1 add constraint T1_FK_ID foreign key (ID) references t2 (ID);
    insert into T1 select rownum sid, T2.* from T2;
    insert into T1 select rownum sid, T2.* from T2;

    --更新Subobject_Name字段,初始為NULL
    update T2 set T2.Subobject_Name='StevenHuang'


    需求:我們希望能把T1表的Subobject_Name字段也全部更新成'StevenHuang',也就是說T1的10000條記錄都會得到更新,以下SQL語句均在PL/SQL命令窗口測試。

    方法一:
    寫PL/SQL,開cursor

    declare 
     l_varID 
    varchar2(20
    );
     l_varSubName 
    varchar2(30
    );
     
    cursor mycur is select T2.Id,T2.Subobject_Name from
     T2;
    begin
     
     
    open
     mycur; 
     loop
          
    fetch mycur into
     l_varID,l_varSubName;
          
    exit when mycur %
    notfound;
          
    update T1 set T1.Subobject_Name = l_varSubName where T1.ID =
     l_varID;
     
    end
     loop;
     
    close
     mycur;
    end;

    ---耗時39.716s
    顯然這是最傳統的方法,如果數據量巨大的話(4000萬記),還會報”snapshot too old”錯誤退出,PL/SQL工具會掛掉

    方法二:
    用loop循環,分批update

    declare 
      
    number
    ;
      
    number
    ;
    begin

      :
    = 1;
      :
    = 0
    ;
    select count(*into from
     T1;
      loop
        
    exit when >
     j;
        
    update T1 set T1.Subobject_Name = (select T2.Subobject_Name from T2 where T1.ID = T2.ID) where T1.ID >= and T1.ID <
     

    (i 
    + 1000
    );
        :
    = + 1000
    ;
      
    end
     loop;
    end
    ;

    --耗時0.656s,這里一共循環了10次,如果數據量巨大的話,雖然能夠完成任務,但是速度還是不能令人滿意。(例如我們將T1--大表增大到100000記錄 T2--小表增大到50000記錄,將耗時10.139s)

    方法三:
    --虛擬一張表來進行操作,在數據量大的情況下效率比方法二高很多.
       注:此語句下T1,T2表中必須有相應的主外建關聯,否則sql編譯不能通過.

    update (select T1.Subobject_Name A1,T2.Subobject_Name B1 from T1,T2 where T1.ID=T2.ID) set A1=B1; 

    --耗時3.234s (T1--大表增大到100000記錄 T2--小表增大到50000記錄)
    *以上所有操作都已經將分析執行計劃所需的時間排除在外

    posted on 2013-01-07 13:14 HUIKK 閱讀(582) 評論(0)  編輯  收藏 所屬分類: DataBase
    主站蜘蛛池模板: 在线精品亚洲一区二区小说| 免费观看美女裸体网站| 久久久精品国产亚洲成人满18免费网站| 亚洲色偷精品一区二区三区 | 99久久免费国产精品特黄| 日本免费一区尤物| 精品国产亚洲一区二区在线观看| 男人和女人高潮免费网站| 美女内射无套日韩免费播放| 在线免费一区二区| 亚洲产国偷V产偷V自拍色戒| 永久免费A∨片在线观看| 久久久久无码精品亚洲日韩| 50岁老女人的毛片免费观看| 成人伊人亚洲人综合网站222| 亚洲AV无码不卡在线播放| 毛片亚洲AV无码精品国产午夜| 久久中文字幕免费视频| 亚洲欧洲校园自拍都市| 天天看片天天爽_免费播放| 菠萝菠萝蜜在线免费视频| 亚洲中文字幕不卡无码| 16女性下面无遮挡免费| 亚洲国产精品成人午夜在线观看| 婷婷综合缴情亚洲狠狠尤物| 中国性猛交xxxxx免费看| 四虎影视在线永久免费看黄| 男女一边摸一边做爽的免费视频| 国产一区二区三区免费在线观看| 一级特级aaaa毛片免费观看| 免费国产在线观看不卡| 三上悠亚在线观看免费| 亚洲大香伊人蕉在人依线| 国产美女被遭强高潮免费网站| 亚洲国产日韩在线| 免费jjzz在在线播放国产| a级毛片高清免费视频| 亚洲人成77777在线播放网站不卡| 一本久久综合亚洲鲁鲁五月天| 国产高清不卡免费视频| 久久精品国产亚洲av麻豆|