konhon

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

          Google

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

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

          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 優(yōu)華 閱讀(1765) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 合川市| 新绛县| 如皋市| 涟源市| 新闻| 桐城市| 淳安县| 吴川市| 宁德市| 上虞市| 冀州市| 凉山| 马边| 腾冲县| 灵宝市| 宁海县| 佛教| 栾川县| 启东市| 永平县| 分宜县| 城固县| 盘锦市| 光山县| 从江县| 尼勒克县| 鹿邑县| 丰都县| 叙永县| 读书| 邯郸市| 密山市| 凤阳县| 泰州市| 盘锦市| 泽库县| 西青区| 井研县| 封丘县| 东乌珠穆沁旗| 乌鲁木齐市|