konhon

          忘掉過去,展望未來。找回自我,超越自我。
          逃避不一定躲的過, 面對不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因為某個理由而傷心難過, 但我卻能找個理由讓自己快樂.

          Google

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks
          批量刪除海量數據通常都是很復雜及緩慢的,方法也很多,但是通常的概念是:分批刪除,逐次提交。
          下面是我的刪除過程,我的數據表可以通過主鍵刪除,測試過Delete和For all兩種方法,for all在這里并沒有帶來性能提高,所以仍然選擇了批量直接刪除。

          首先創建一下過程,使用自制事務進行處理:

          create or replace procedure delBigTab
          (
          p_TableName       in    varchar2,
          p_Condition       in    varchar2,
          p_Count        in    varchar2
          )
          as
          pragma autonomous_transaction;
          n_delete number:=0;
          begin
          while 1=1 loop
          EXECUTE IMMEDIATE
          'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
          USING p_Count;
          if SQL%NOTFOUND then
          exit;
          else
          n_delete:=n_delete + SQL%ROWCOUNT;
          end if;
          commit;
          end loop;
          commit;
          DBMS_OUTPUT.PUT_LINE('Finished!');
          DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
          end;

          以下是刪除過程及時間:
          SQL> create or replace procedure delBigTab
            2  (
            3    p_TableName       in    varchar2,
            4    p_Condition       in    varchar2,
            5    p_Count        in    varchar2
            6  )
            7  as
            8   pragma autonomous_transaction;
            9   n_delete number:=0;
          10  begin
          11   while 1=1 loop
          12     EXECUTE IMMEDIATE
          13       'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
          14     USING p_Count;
          15     if SQL%NOTFOUND then
          16        exit;
          17     else
          18              n_delete:=n_delete + SQL%ROWCOUNT;
          19     end if;
          20     commit;
          21   end loop;
          22   commit;
          23   DBMS_OUTPUT.PUT_LINE('Finished!');
          24   DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
          25  end;
          26  /

          Procedure created.

          SQL> set timing on
          SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

          MIN(NUMDLFLOGGUID)
          ------------------
                    11000000

          Elapsed: 00:00:00.23
          SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11100000','10000');

          PL/SQL procedure successfully completed.

          Elapsed: 00:00:18.54
          SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

          MIN(NUMDLFLOGGUID)
          ------------------
                    11100000

          Elapsed: 00:00:00.18
          SQL> set serveroutput on
          SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11200000','10000');
          Finished!
          Totally 96936 records deleted!

          PL/SQL procedure successfully completed.

          Elapsed: 00:00:18.61
          10萬記錄大約19s

          SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11300000','10000');
          Finished!
          Totally 100000 records deleted!

          PL/SQL procedure successfully completed.

          Elapsed: 00:00:18.62
          SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11400000','10000');
          Finished!
          Totally 100000 records deleted!

          PL/SQL procedure successfully completed.

          Elapsed: 00:00:18.85
          SQL>
          SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 13000000','10000');
          Finished!
          Totally 1000000 records deleted!

          PL/SQL procedure successfully completed.

          Elapsed: 00:03:13.87

          100萬記錄大約3分鐘
          SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 20000000','10000');

          Finished!
          Totally 6999977 records deleted!

          PL/SQL procedure successfully completed.

          Elapsed: 00:27:24.69
          700萬大約27分鐘

          posted on 2005-10-17 05:20 konhon 優華 閱讀(1765) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 永修县| 皋兰县| 阿克苏市| 扶风县| 苍南县| 曲阜市| 布拖县| 贞丰县| 福贡县| 揭阳市| 开封县| 虎林市| 融水| 富源县| 洛阳市| 沙河市| 哈密市| 西峡县| 当涂县| 昭平县| 枞阳县| 绥宁县| 微博| 茌平县| 铜川市| 佛学| 思南县| 青海省| 崇阳县| 璧山县| 乐业县| 武定县| 万荣县| 彰化市| 九龙县| 枝江市| 珲春市| 定州市| 巧家县| 文成县| 同仁县|