<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毛片免费观看| 亚洲福利电影一区二区?| 国产亚洲精品a在线无码| 亚洲视频在线一区二区| 免费看大黄高清网站视频在线| 亚洲香蕉免费有线视频| a毛片在线还看免费网站| 一级毛片完整版免费播放一区| 亚洲第一综合天堂另类专 | 亚洲AV综合色区无码一二三区 | 亚洲精品tv久久久久久久久久| 黄网址在线永久免费观看 | 国产精品成人啪精品视频免费| 国产在线精品观看免费观看| 一级一黄在线观看视频免费| 成人毛片100免费观看| 美女被免费网站91色| 在线观看免费中文视频| 啦啦啦在线免费视频| 久久久无码精品亚洲日韩软件| 亚洲精品免费在线观看| 亚洲色大成WWW亚洲女子| 校园亚洲春色另类小说合集| 成人A片产无码免费视频在线观看| 成人免费视频69| 在线精品亚洲一区二区小说 | 18禁止观看免费私人影院| 五月婷婷亚洲综合| 亚洲国产日韩在线一区| 国产乱妇高清无乱码免费| 18禁免费无码无遮挡不卡网站| 国产L精品国产亚洲区久久| 亚洲中文字幕在线无码一区二区| 一级毛片高清免费播放| 可以免费看黄视频的网站| 亚洲视频人成在线播放| 亚洲av成人片在线观看| 日本XXX黄区免费看| 亚洲AV无码久久|