<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 閱讀(570) 評論(0)  編輯  收藏 所屬分類: DataBase
    主站蜘蛛池模板: 日本一区二区在线免费观看| 亚洲人成电影福利在线播放 | 国产精品亚洲综合久久| 久别的草原电视剧免费观看| 免费一级毛片在线播放| 亚洲区视频在线观看| 久久国产精品萌白酱免费| 麻豆成人精品国产免费| 亚洲成人网在线观看| 免费看黄视频网站| 日产亚洲一区二区三区| 久久er国产精品免费观看2| 亚洲中文字幕无码一区| 国产高清对白在线观看免费91| 四虎1515hm免费国产| 丝瓜app免费下载网址进入ios| 成人黄动漫画免费网站视频 | 免费观看美女用震蛋喷水的视频 | 亚洲AV无码日韩AV无码导航| 91青青青国产在观免费影视| 国产成人精品日本亚洲网址 | 亚洲人配人种jizz| 日韩亚洲国产二区| 最近免费mv在线观看动漫| 亚洲喷奶水中文字幕电影| 日韩a在线观看免费观看| 中文字幕视频在线免费观看 | 亚洲aⅴ无码专区在线观看| 亚洲精品色午夜无码专区日韩| 国产成人yy免费视频| 一区二区免费在线观看| 亚洲综合色丁香麻豆| 免费a级毛片永久免费| 日韩精品免费一级视频| h视频在线观看免费| 亚洲制服丝袜一区二区三区| 亚洲伊人成无码综合网| 夜夜爽免费888视频| 1000部夫妻午夜免费| 国产啪精品视频网站免费尤物| 亚洲AV无码之国产精品|