<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    rednight

    0x2B|~0x2B,That's not a question,Just do it.
    posts - 32, comments - 14, trackbacks - 0, articles - 0

    批量刪除數據庫記錄

    Posted on 2006-08-24 21:27 rednight 閱讀(2150) 評論(0)  編輯  收藏

    從網上搜的帖子,忘記是哪里的,保存在這里以便隨時查看.

    在使用delete語句刪除數據時,數據庫是要做日志記錄的,以便將來可以恢復數據,可是我在刪除上百萬條數據時,十分緩慢甚至死機,請問有沒有什么好方法?

      網友觀點一:

    create or replace procedure delete_table
    is
    i number(10);
    begin
    ? for x in (select * from emp where DEPTNO like 'a%')
    ? loop
    ????? delete emp where emp.id = x.id
    ????? i:=i+1;
    ????? if i>1000 then
    ???????? commit;
    ???????? i:=0;
    ????? end if;
    ? end loop;
    exception
    ??? when others then
    ???????? dbms_out.put_line(sqlcode);
    ???????? rollback;
    end delete_table;

      網友觀點二:

    這個是我平常用來批量刪除數據,每500條數據提交一次。
    DECLARE
    CNT NUMBER(10):=0;
    I NUMBER(10);
    BEGIN
    SELECT COUNT(*) INTO CNT FROM ep_arrearage_bak WHERE TO_CHAR(DF_DATE,'MM')='01';

    FOR I IN 1..TRUNC(CNT/500)+1 LOOP
    DELETE FROM ep_arrearage_bak WHERE TO_CHAR(DF_DATE,'MM')='01' AND ROWNUM<=500;
    COMMIT;
    END LOOP;
    END;

      專家意見:幾個辦法:

      1. 如果刪除的數據是大部分,建議使用樓上的方法把要保留的數據放在一個臨時表里,truncate table后再放回來

      2. 也可以分段提交,樓上也提到了

      3. 專門使用一個大回滾段

      4. 如果確認將來不需要做恢復,改為非歸檔模式,刪除完改回來再做個備份.

      專家給出的解決方案:

    有條件的分步刪除數據表中的記錄
    --創建測試表
    create table test as select * from dba_objects;

    Table created.
    --創建刪除表的存儲過程
    ?create or replace procedure deleteTab
    --插入語句
    ?? SQL> insert into test select * from dba_objects;

    6374 rows created.

    SQL> /

    6374 rows created.

    SQL> /

    6374 rows created.

    SQL> commit;

    --創建刪除的存儲過程
    create or replace procedure deleteTab
    ? /**
    ?? ** Usage: run the script to create the proc deleteTab
    ?? **??????? in SQL*PLUS, type "exec deleteTab('Foo','ID>=1000000','3000');"
    ?? **??????? to delete the records in the table "Foo", commit per 3000 records.
    ?? **?????? Condition with default value '1=1' and default Commit batch is 10000.
    ?? **/
    ? (
    ??? p_TableName??? in??? varchar2,??? -- The TableName which you want to delete from
    ??? p_Condition??? in??? varchar2 default '1=1',??? -- Delete condition, such as "id>=100000"
    ??? p_Count??????? in??? varchar2 default '10000'??? -- Commit after delete How many records
    ? )
    ? 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> exec deleteTab('TEST','object_id >0','10000')
    你看看執行結果我試驗過,效果還可以


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 中文字幕亚洲免费无线观看日本| 日韩亚洲产在线观看| 欧洲美女大片免费播放器视频| 成人免费一区二区三区在线观看| 国产JIZZ中国JIZZ免费看| 可以免费观看一级毛片黄a| AV在线播放日韩亚洲欧| 噜噜噜亚洲色成人网站| 免费a级黄色毛片| 人妻18毛片a级毛片免费看| 日韩亚洲国产高清免费视频| 亚洲精品不卡视频| 成人免费观看一区二区| 亚洲精品无码午夜福利中文字幕| 亚美影视免费在线观看| 亚洲精品成人网站在线观看| 久久精品私人影院免费看| 亚洲色大成网站www永久| 精品一区二区三区免费观看 | 亚洲高清国产拍精品26U| 亚洲日本乱码卡2卡3卡新区| 99久久免费精品国产72精品九九| 亚洲成A人片在线观看WWW| 人妻无码一区二区三区免费 | 91手机看片国产永久免费| 国产亚洲福利在线视频| 免费人妻无码不卡中文字幕18禁| 一个人看的hd免费视频| 久久精品亚洲中文字幕无码网站| 国产91免费视频| 亚洲爱情岛论坛永久| 一级毛片免费播放视频| 久久精品亚洲综合专区| 国产日本一线在线观看免费| 美女的胸又黄又www网站免费| 67194成是人免费无码| 曰批全过程免费视频观看免费软件| 亚洲色WWW成人永久网址| 黄+色+性+人免费| 免费一区二区无码视频在线播放| 亚洲成人午夜在线|