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 優華 閱讀(1769) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 浙江省| 嵊泗县| 吉木乃县| 南木林县| 冷水江市| 福贡县| 张家口市| 大同市| 金昌市| 新化县| 株洲县| 绍兴市| 东乡| 武穴市| 靖江市| 西林县| 山阴县| 普兰县| 安溪县| 中西区| 广宗县| 灵宝市| 玉屏| 襄汾县| 舒城县| 启东市| 界首市| 石门县| 上林县| 庆元县| 鄢陵县| 兴安盟| 芜湖市| 大埔区| 合肥市| 西昌市| 云霄县| 东兰县| 都兰县| 新昌县| 兴宁市|