好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Oracle使用游標進行分批次更新數(shù)據(jù)的6種方式及速度比對

Oracle使用游標進行分批次更新數(shù)據(jù)的6種方式及速度比對

熱門標簽:杭州網(wǎng)絡外呼系統(tǒng)運營商 鶴壁電話機器人價格 安陽企業(yè)電銷機器人供應商 電銷套路機器人 汽車4s店百度地圖標注店 網(wǎng)貸外呼系統(tǒng)合法嗎 地圖標注坐標圖標 手機地圖標注門店 地圖標注效果的制作

1.情景展示

  一共有22w條數(shù)據(jù), 需要將A表的主鍵更新至B表的指定字段,如何快速完成更新?

2.解決方案

  聲明:

  解決方案不只一種,該文章只介紹快速游標法及代碼實現(xiàn);

  兩張表的ID和ID_CARD字段都建立了索引。 

  方式一:使用隱式游標(更新一次提交1次)

--快速游標法
BEGIN
  FOR TEMP_CURSOR IN (SELECT T2.ID, T2.ID_CARD
                        FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
                       WHERE T1.ID_CARD = T2.ID_CARD
                         AND T1.REMARK = '**市****區(qū)數(shù)據(jù)'
                         AND T2.REMARK = '**市****區(qū)數(shù)據(jù)') LOOP
    /* LOOP循環(huán)的是TEMP_CURSOR(逐條讀取TEMP_CURSOR) */
    UPDATE VIRTUAL_CARD10
       SET INDEX_ID = TEMP_CURSOR.ID
     WHERE ID_CARD = TEMP_CURSOR.ID_CARD;
    COMMIT; --提交
  END LOOP;
END;

  執(zhí)行時間:

  方式二:使用隱式游標(更新1000次提交1次)(推薦使用)

/* 使用隱式游標進行分批次更新 */
DECLARE
 V_COUNT NUMBER(10);
BEGIN
 /* 隱式游標 */
 FOR TEMP_CURSOR IN (SELECT T2.ID, T2.ID_CARD
            FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
            WHERE T1.ID_CARD = T2.ID_CARD
             AND T1.REMARK = '**市****區(qū)數(shù)據(jù)'
             AND T2.REMARK = '**市****區(qū)數(shù)據(jù)') LOOP
  /* 業(yè)務邏輯 */
  UPDATE VIRTUAL_CARD10
    SET INDEX_ID = TEMP_CURSOR.ID
   WHERE ID_CARD = TEMP_CURSOR.ID_CARD;
  /* 更新一次,+1 */
  V_COUNT := V_COUNT + 1;
  /* 1000條提交1次 */
  IF V_COUNT >= 1000 THEN
   COMMIT; --提交
   V_COUNT := 0; --重置
  END IF;
 END LOOP;
 COMMIT; -- 提交所有數(shù)據(jù),把這個去掉,可以查看是否是自己想要的效果,再決定是否提交
END;

  執(zhí)行時間:

  方式三:顯式游標+分批次更新(1000條1提交)

/* 使用游標進行分批次更新 */
DECLARE
  V_COUNT    NUMBER(10);
  V_INDEX_ID PRIMARY_INDEX10.ID%TYPE;
  V_ID_CARD  PRIMARY_INDEX10.ID_CARD%TYPE;
  CURSOR TEMP_CURSOR IS
    SELECT T2.ID, T2.ID_CARD
      FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
     WHERE T1.ID_CARD = T2.ID_CARD
       AND T1.REMARK = '**市****區(qū)數(shù)據(jù)'
       AND T2.REMARK = '**市****區(qū)數(shù)據(jù)';
BEGIN
  OPEN TEMP_CURSOR;
  LOOP
    /* 取得一行游標數(shù)據(jù)并放到對應變量中 */
    FETCH TEMP_CURSOR
      INTO V_INDEX_ID, V_ID_CARD;
    /* 如果沒有數(shù)據(jù)則退出 */
    EXIT WHEN TEMP_CURSOR%NOTFOUND;
    /* 業(yè)務邏輯 */
    UPDATE VIRTUAL_CARD10
       SET INDEX_ID = V_INDEX_ID
     WHERE ID_CARD = V_ID_CARD;
    /* 更新一次,+1 */
    V_COUNT := V_COUNT + 1;
    /* 1000條提交1次 */
    IF V_COUNT >= 1000 THEN
      COMMIT; --提交
      V_COUNT := 0; --重置
    END IF;
  END LOOP;
  COMMIT; -- 提交所有數(shù)據(jù),把這個去掉,可以查看是否是自己想要的效果,再決定是否提交
  CLOSE TEMP_CURSOR;
END;

  執(zhí)行時間:

  10000條1提交,執(zhí)行時間:

  方式四:顯式游標+數(shù)組(更新一次提交一次)(使用BULK COLLECT)

/* 使用游標+數(shù)組進行更新(更新一次提交一次) */
DECLARE
  /* 創(chuàng)建數(shù)組:一列多行 */
  TYPE TYPE_INDEX_ID IS TABLE OF PRIMARY_INDEX10.ID%TYPE;
  TYPE TYPE_ID_CARD IS TABLE OF PRIMARY_INDEX10.ID_CARD%TYPE;
  /* 起別名 */
  V_INDEX_ID TYPE_INDEX_ID;
  V_ID_CARD  TYPE_ID_CARD;
  /* 將查詢出來的數(shù)據(jù)放到游標里 */
  CURSOR TEMP_CURSOR IS
    SELECT T2.ID, T2.ID_CARD
      FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
     WHERE T1.ID_CARD = T2.ID_CARD
       AND T1.REMARK = '**市****區(qū)數(shù)據(jù)'
       AND T2.REMARK = '**市****區(qū)數(shù)據(jù)';
BEGIN
  OPEN TEMP_CURSOR;
  LOOP
    /* 取得1000行游標數(shù)據(jù)并放到對應數(shù)組中,每次讀取1000條數(shù)據(jù) */
    FETCH TEMP_CURSOR BULK COLLECT
      INTO V_INDEX_ID, V_ID_CARD LIMIT 1000;
    /* 如果沒有數(shù)據(jù)則退出 */
    EXIT WHEN TEMP_CURSOR%NOTFOUND;
    /* 遍歷數(shù)據(jù) */
    FOR I IN V_INDEX_ID.FIRST .. V_INDEX_ID.LAST LOOP
      /* 業(yè)務邏輯 */
      UPDATE VIRTUAL_CARD10
         SET INDEX_ID = V_INDEX_ID(I)
       WHERE ID_CARD = V_ID_CARD(I);
      COMMIT;
    END LOOP;
  END LOOP;
  CLOSE TEMP_CURSOR;
END;

  執(zhí)行時間:

  方式五: 顯式游標+數(shù)組(1000條提交一次)(使用BULK COLLECT)

/* 使用游標+數(shù)組進行更新(1000條提交一次) */
DECLARE
  /* 創(chuàng)建數(shù)組:一列多行 */
  TYPE TYPE_INDEX_ID IS TABLE OF PRIMARY_INDEX10.ID%TYPE;
  TYPE TYPE_ID_CARD IS TABLE OF PRIMARY_INDEX10.ID_CARD%TYPE;
  /* 起別名 */
  V_INDEX_ID TYPE_INDEX_ID;
  V_ID_CARD  TYPE_ID_CARD;
  /* 將查詢出來的數(shù)據(jù)放到游標里 */
  CURSOR TEMP_CURSOR IS
    SELECT T2.ID, T2.ID_CARD
      FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
     WHERE T1.ID_CARD = T2.ID_CARD
       AND T1.REMARK = '**市****區(qū)數(shù)據(jù)'
       AND T2.REMARK = '**市****區(qū)數(shù)據(jù)';
BEGIN
  OPEN TEMP_CURSOR;
  LOOP
    /* 取得1000行游標數(shù)據(jù)并放到對應數(shù)組中 */
    FETCH TEMP_CURSOR BULK COLLECT
      INTO V_INDEX_ID, V_ID_CARD LIMIT 1000;
    /* 如果沒有數(shù)據(jù)則退出 */
    EXIT WHEN TEMP_CURSOR%NOTFOUND;
    /* 遍歷數(shù)據(jù) */
    FOR I IN V_INDEX_ID.FIRST .. V_INDEX_ID.LAST LOOP --或者:FOR I IN 1 .. V_INDEX_ID.COUNT LOOP
      /* 業(yè)務邏輯 */
      UPDATE VIRTUAL_CARD10
         SET INDEX_ID = V_INDEX_ID(I)
       WHERE ID_CARD = V_ID_CARD(I);
      IF I >= V_INDEX_ID.LAST THEN
        COMMIT; --提交
      END IF;
    END LOOP;
  END LOOP;
  CLOSE TEMP_CURSOR;
END;

  執(zhí)行時間:

  方式六:推薦使用(使用BULK COLLECT和FORALL)

/* 使用游標+數(shù)組進行更新(BULK COLLECT和FORALL) */
DECLARE
  /* 創(chuàng)建數(shù)組:一列多行 */
  TYPE TYPE_INDEX_ID IS TABLE OF PRIMARY_INDEX10.ID%TYPE;
  TYPE TYPE_ID_CARD IS TABLE OF PRIMARY_INDEX10.ID_CARD%TYPE;
  /* 起別名 */
  V_INDEX_ID TYPE_INDEX_ID;
  V_ID_CARD  TYPE_ID_CARD;
  /* 將查詢出來的數(shù)據(jù)放到游標里 */
  CURSOR TEMP_CURSOR IS
    SELECT T2.ID, T2.ID_CARD
      FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
     WHERE T1.ID_CARD = T2.ID_CARD
       AND T1.REMARK = '**市****區(qū)數(shù)據(jù)'
       AND T2.REMARK = '**市****區(qū)數(shù)據(jù)';
BEGIN
  OPEN TEMP_CURSOR;
  LOOP
    /* 取得1000行游標數(shù)據(jù)并放到對應數(shù)組中 */
    FETCH TEMP_CURSOR BULK COLLECT
      INTO V_INDEX_ID, V_ID_CARD LIMIT 1000;
    /* 如果沒有數(shù)據(jù)則退出 */
    EXIT WHEN TEMP_CURSOR%NOTFOUND;
    /* 遍歷數(shù)據(jù) */
    FORALL I IN 1 .. V_INDEX_ID.COUNT-- 或者V_INDEX_ID.FIRST .. V_INDEX_ID.LAST
    /* 業(yè)務邏輯 */
      UPDATE VIRTUAL_CARD10
         SET INDEX_ID = V_INDEX_ID(I)
       WHERE ID_CARD = V_ID_CARD(I);
    COMMIT; --提交
  END LOOP;
  CLOSE TEMP_CURSOR;
END;

  執(zhí)行時間:

  從Oracle8開始,oracle為PL/SQL引入了兩個新的數(shù)據(jù)操縱語言(DML)語句:BULK COLLECT和FORALL。

  這兩個語句在PL/SQL內(nèi)部進行一種數(shù)組處理;BULK COLLECT提供對數(shù)據(jù)的高速檢索,F(xiàn)ORALL可大大改進INSERT、UPDATE和DELETE操作的性能。

  Oracle數(shù)據(jù)庫使用這些語句大大減少了PL/SQL與SQL語句執(zhí)行引擎的環(huán)境切換次數(shù),從而使其性能有了顯著提高。 

小結(jié):

  數(shù)據(jù)量小的時候可以用方式二,數(shù)據(jù)量大的時候推薦使用方式六;

  一定要建索引。

以上就是Oracle使用游標進行分批次更新的6種方式及速度比對的詳細內(nèi)容,更多關(guān)于Oracle 游標的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Oracle 遍歷游標的四種方式匯總(for、fetch、while、BULK COLLECT)
  • Oracle數(shù)據(jù)庫游標連接超出解決方案
  • 詳解Oracle游標的簡易用法
  • Oracle游標的使用實例詳解
  • Oracle中游標Cursor基本用法詳解
  • 詳解Oracle隱式游標和顯式游標
  • Oracle存儲過程游標用法分析
  • Oracle出現(xiàn)超出打開游標最大數(shù)的解決方法
  • Oracle顯示游標的使用及游標for循環(huán)
  • Oracle存儲過程返回游標實例詳解
  • Oracle 游標使用總結(jié)

標簽:焦作 泰安 酒泉 南陽 梧州 河源 柳州 銀川

巨人網(wǎng)絡通訊聲明:本文標題《Oracle使用游標進行分批次更新數(shù)據(jù)的6種方式及速度比對》,本文關(guān)鍵詞  Oracle,使用,游標,進行,分,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle使用游標進行分批次更新數(shù)據(jù)的6種方式及速度比對》相關(guān)的同類信息!
  • 本頁收集關(guān)于Oracle使用游標進行分批次更新數(shù)據(jù)的6種方式及速度比對的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 91女厕精品合集KTV偷窥美女嘘嘘| 十九岁在线观看免费完整版电影| 国产精品熟女乱婬999| a一级免费视频| 在线观看国产| 清超市欲目录大团结| 潘金莲1一8荡系H文| 亚洲 自拍 另类小说综合图区| 亚洲国产网| 差差漫画在线看漫画| 又黑又长黑人欧美三级| 综合图片小说| 欧美 卡通 另类 偷拍 在线| qing妇电影韩国无删减| 美女鸡鸡对鸡鸡| 99久久99久久精品国产片竹菊| 337p粉嫩大胆色噜噜噜| 黄网站色在线视频免费观看| 顺风妇产科| 美女厕所尿尿擦逼| 久久久亚洲熟妇熟女ⅩXXX片| 狠狠色综合一区二区| 久草视频福利在线观看| 日日精品| 国产伦精品一区二区三区视频| 欧美成人511性影院视频社区| 真人实拍女处破www免费看动漫| 精品久久久噜噜噜久久久app | 观看免费乱媱男女媱妓女| 日本免费一曲二曲三曲四曲| 我想看一级黄色大片| 在线精品自拍亚洲第一区| 免费黄色三级网站| 免费看美女部位隐私| 国产在线98福利播放视频免费| 男男视频网站| 里番全彩| 天堂成人精品视频在线观| 91丨九色丨国产熟女??在线| 国产又粗又猛又爽又黄的视频蜜蜜| 精精国产xxx在线视频app|