<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在线播放| 一个人看的免费视频www在线高清动漫 | 国产A∨免费精品视频| 亚洲色偷拍区另类无码专区| 久久99精品免费一区二区| 久久久久亚洲AV无码专区首| 日韩精品内射视频免费观看| 亚洲午夜一区二区电影院| 成年女人毛片免费观看97| 国产成人亚洲精品播放器下载| gogo全球高清大胆亚洲| a级日本高清免费看| 亚洲美女中文字幕| 成人免费看吃奶视频网站| 美女被爆羞羞网站免费| 好看的亚洲黄色经典| 免费播放特黄特色毛片| 国产精品免费久久久久影院 | 亚洲成A人片在线观看无码3D| 成人片黄网站色大片免费观看cn | 亚洲国产成人综合| 国产免费拔擦拔擦8x| 国产在线精品观看免费观看| 亚洲综合小说久久另类区| 在线观着免费观看国产黄| selaoban在线视频免费精品| 亚洲美女激情视频| 亚洲欧洲精品成人久久曰影片 | 女人18毛片免费观看| 一级一级毛片免费播放| 亚洲激情视频网站| 亚洲精品综合久久| 青青视频观看免费99| 国产VA免费精品高清在线| 精品日韩99亚洲的在线发布|