<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

    批量刪除數(shù)據(jù)庫記錄

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

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

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

      網(wǎng)友觀點(diǎn)一:

    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;

      網(wǎng)友觀點(diǎn)二:

    這個是我平常用來批量刪除數(shù)據(jù),每500條數(shù)據(jù)提交一次。
    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. 如果刪除的數(shù)據(jù)是大部分,建議使用樓上的方法把要保留的數(shù)據(jù)放在一個臨時表里,truncate table后再放回來

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

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

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

      專家給出的解決方案:

    有條件的分步刪除數(shù)據(jù)表中的記錄
    --創(chuàng)建測試表
    create table test as select * from dba_objects;

    Table created.
    --創(chuàng)建刪除表的存儲過程
    ?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;

    --創(chuàng)建刪除的存儲過程
    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;
    ? /

    --執(zhí)行語句
    SQL> exec deleteTab('TEST','object_id >0','10000')
    你看看執(zhí)行結(jié)果我試驗過,效果還可以


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲国产成人久久精品大牛影视| 四虎永久免费观看| 亚洲国产另类久久久精品小说 | 日韩在线视频免费看| 国产亚洲精品成人AA片| 国产亚洲精品免费视频播放| 精品韩国亚洲av无码不卡区| aaa毛片免费观看| 伊人久久综在合线亚洲91| 久久国产精品免费一区| 国产偷v国产偷v亚洲高清| 永久免费av无码入口国语片| 亚洲avav天堂av在线不卡| 最近免费中文字幕大全免费版视频| 亚洲国产精品自在线一区二区| 日韩视频在线观看免费| 亚洲黄色高清视频| 妞干网在线免费视频| 亚洲熟妇无码另类久久久| 黄色片免费在线观看| 亚洲免费在线视频| 国产在线观看免费观看不卡| 亚洲人成色4444在线观看| 亚洲 自拍 另类小说综合图区| 久久久久免费视频| 亚洲精品高清国产麻豆专区| 最近中文字幕无吗免费高清| 免费高清A级毛片在线播放| 亚洲人成无码网站| 亚洲香蕉免费有线视频| 亚洲国产精品无码久久九九大片| 国产av无码专区亚洲国产精品| 日本免费一区二区三区| 亚洲乱理伦片在线观看中字| 亚洲综合无码AV一区二区| 国产成人福利免费视频| 免费一级全黄少妇性色生活片 | 亚洲今日精彩视频| 免费高清在线影片一区| 亚洲fuli在线观看| 亚洲午夜福利精品久久|