现在有一个存储过程是delete 某个oracle表里的记录.这个sp的逻辑很简单,就是根据时间删除记录.这个表的结构也很简单,但是可能是有两个column 是大数据,执行的性能很慢.请问大家如何能够提高这个sp的性能?
欢迎大家提出各种可能的方法,我会一一测试.
谢谢!
欢迎大家提出各种可能的方法,我会一一测试.
谢谢!
解决方案 »
- 创建表
- 触发器中关于rowid
- 求sql更新数据语句,怎么把4变成0004,L变成000L。
- OSB:做权限控制时报错,100求教
- 求教:能否控制某个用户的访问进程数
- 请问如何将某用户的所有表一次性删除
- 通过jdbc怎样取得oracle中某一个number类型的字段的scale和precision?
- 在VB.net中如何去除从Oracle数据库中取出的Varchar字符串的空格?
- oracle双机热备怎么做?
- Kettle同步数据问题
- oracle 9i 数据链接 sql server 报ora-28545 错误,是否跟NTFS有关
- [求助]windows XP下Oracle安装失败,什么原因?(见截图)
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语句删除了记录,空间是不会回收的,碎片会越来越多。