国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

案例討論:批量刪除Oracle數(shù)據(jù)庫的數(shù)據(jù)

2024-08-29 13:50:09
字體:
供稿:網(wǎng)友
在使用delete語句刪除數(shù)據(jù)時,數(shù)據(jù)庫是要做日志記錄的,以便將來可以恢復數(shù)據(jù),可是我在刪除上百萬條數(shù)據(jù)時,十分緩慢甚至死機,請問有沒有什么好方法?   網(wǎng)友觀點一:
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)友觀點二:
這個是我平常用來批量刪除數(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. 假如確認將來不需要做恢復,改為非歸檔模式,刪除完改回來再做個備份.  專家給出的解決方案:
有條件的分步刪除數(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é)果我試驗過,效果還可以


上一篇:數(shù)據(jù)技術(shù)求職點評:Oracle DBA面試題

下一篇:Oracle學習快速入門基礎(chǔ)教程

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 扎赉特旗| 新巴尔虎右旗| 寿宁县| 兴国县| 清水河县| 沙湾县| 西吉县| 澎湖县| 扶绥县| 海兴县| 高雄市| 视频| 本溪市| 宁河县| 出国| 桓台县| 故城县| 台湾省| 北票市| 禹州市| 永靖县| 新沂市| 鲁甸县| 三台县| 将乐县| 古浪县| 湖州市| 阿城市| 富裕县| 高台县| 德阳市| 江门市| 遂昌县| 垣曲县| 和静县| 灯塔市| 平遥县| 汕尾市| 辛集市| 米脂县| 红原县|