1. 首先确保delete 的where 查询要快,这个时候要考虑索引的问题,是否有合适的所以可以用? 2.如果数据量很大,一定要考虑分批来delete,这一方面是为了考虑undo tablespace 的大小,另外也是分而治之的策略,一次的处理量少了之后,效率也会有很大提高;分批commit;比如,可以这样来设计:SQL> declare 2 i number; 3 begin 4 for i in 1..100 loop 5 delete from test1 where rownum<=10; 6 dbms_output.put_line(i); 7 if (sql%rowcount <10 ) then 8 commit; 9 exit ; 10 end if; 11 commit; 12 end loop; 13 end; 14 /
2.提高硬件配置.不过,大批量的delete其性能提高的可能性很小.
2.如果数据量很大,一定要考虑分批来delete,这一方面是为了考虑undo tablespace 的大小,另外也是分而治之的策略,一次的处理量少了之后,效率也会有很大提高;分批commit;比如,可以这样来设计:SQL> declare
2 i number;
3 begin
4 for i in 1..100 loop
5 delete from test1 where rownum<=10;
6 dbms_output.put_line(i);
7 if (sql%rowcount <10 ) then
8 commit;
9 exit ;
10 end if;
11 commit;
12 end loop;
13 end;
14 /
呵呵,如果对于要做的delete 操作的准确性都不能确保,还做什么啊?如果担心删错数据,必要的话先备份一下数据!
分批刪除,有過經歷
包括 插入大量數據也要適當分批commit
然后再附上表结构和数据量
最好我执行计划也贴出来!!!
有以下办法,仅供参考:
1、删除 前先把 在删除范围中记录的那2个字段值先update成空(可能充许的话,最好不好日志),再执行记录删除。
2、避开系统使用高峰期做删除,可以先对要删除的记录只作删除标识,但不真正删除记录,=系统空闲时再做真正的删除。还有。如果你这个表经常做此类删除操作话,最好定期的对表进行空间压缩,一般的delete语句删除了记录,空间是不会回收的,碎片会越来越多。