在使用delete語句删除資料時,資料庫是要做日志記錄的,以便将來可以恢複資料,可是我在删除上百萬條資料時,十分緩慢甚至當機,請問有沒有什麼好方法?[@more@]
網友觀點一:
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
(
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')
你看看執行結果我試驗過,效果還可以