在使用delete語句刪除資料時,資料庫是要做日誌記錄的,以便將來可以恢復資料,可是我在刪除上百萬條資料時,十分緩慢甚至宕機,請問有沒有什麼好方法?[@more@]
網友觀點一:
create or replace procedure delete_table
isi 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')
你看看執行結果我試驗過,效果還可以
批量插入oracle資料庫
odp技術,引數可以為陣列 注意事項 1 時間處理 防止資料庫中有date型別的資料,不設定格式則會出現無效月份的情況,如 new oracledate 2011 08 26 17 18 19 oracleglobalization og oracleglobalization.getclienti...
資料批量匯入Oracle資料庫
表resultxt 3 行載入成功 由於資料錯誤,0 行沒有載入。由於所有 when 子句失敗,0 行沒有載入。由於所有欄位都為空的,0 行沒有載入。為結合陣列分配的空間 65016位元組 63行 除繫結陣列外的記憶體空間分配 0位元組 跳過的邏輯記錄總數 0 讀取的邏輯記錄總數 3 拒絕的邏輯記錄...
Oracle資料庫 刪除資料庫
1 單擊 開始 oracle oradb12home1 database configuration assistant 進入刪除步驟的第一步,選擇 刪除資料庫 2 單擊 下一步 按鈕,如圖所示。在資料庫列表中選擇需要刪除的資料,例如test,並輸入使用者名稱和口令。3 單擊 下一步 按鈕,開啟 管...