1. 程式人生 > >oracle批量刪除

oracle批量刪除

專案中有個需求需要每個月末定時去刪除一張表裡的歷史資料,

剛開始就寫了一個簡單的delete語句,然後起一個JOB定時去呼叫,

後來被告知歷史資料量很大,所以從效能和安全上考慮對sql進行了如下修改:

declare cursor ID_KEY_CURSOR is
    select ID_KEY 
      from X_TABLE 
    where X_COLUMN = "xxx"
begin
    for V_TO_DEL in ID_KEY_CURSOR loop
        delete X_TABLE
        where ID_KEY = V_TO_DEL.ID_KEY
    if mod(ID_KEY_CURSOR%Rowcount, 5000) = 0
        then commit;
    end if;
    end loop;
    commit;
end;


將處理的資料每5000筆提交一次,分批處理;

ID_KEY可以是X_TABLE的主鍵,也可以是ROW_ID;

上面的方法使用了遊標,迴圈開啟遊標會影響一定的效能

下面是一種效率更高的方法

begin
    loop
        delete from table_name 
        where column_name = 'xxx'
           and  rownum <=5000;
        exit when sql%notfound;
        commit;
    end loop;
end;