<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')
    你看看執行結果我試驗過,效果還可以


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


    網站導航:
     
    主站蜘蛛池模板: 国产男女猛烈无遮挡免费网站| 一级毛片免费不卡在线| 午夜爱爱免费视频| 在线观看日本亚洲一区| 久久久久国色AV免费看图片| 亚洲香蕉久久一区二区三区四区| 91免费国产自产地址入| 亚洲不卡1卡2卡三卡2021麻豆| www视频免费看| va天堂va亚洲va影视中文字幕| 97人妻无码一区二区精品免费| 亚洲人成网站18禁止久久影院| 一二三四免费观看在线电影 | 久久精品国产亚洲Aⅴ香蕉| 一本久久免费视频| 国产AV无码专区亚洲精品| 人人揉揉香蕉大免费不卡| 亚洲精品视频在线观看免费| 野花高清在线电影观看免费视频| 亚洲日韩国产欧美一区二区三区| 国产高清视频在线免费观看| 一级毛片免费视频网站| 久久国产精品亚洲综合| 香蕉97超级碰碰碰免费公| 亚洲爆乳精品无码一区二区| 亚洲国产精品一区二区三区久久| a级毛片免费完整视频| 久久久久se色偷偷亚洲精品av| 国产免费啪嗒啪嗒视频看看| 搡女人免费免费视频观看| 亚洲依依成人精品| 亚洲成A人片在线观看无码3D| 成人片黄网站色大片免费观看APP| 亚洲人成网站18禁止久久影院| 亚洲AV无码之日韩精品| 免费视频精品一区二区三区 | 国产亚洲精品精品精品| 亚洲乱亚洲乱淫久久| 免费理论片51人人看电影| 中文字幕高清免费不卡视频| 亚洲av无码片在线观看|