Welcome to Rolland Town which Record fire's life.
2006年10月31日代码生活

评论关闭

删除大量Oracle数据方法总结

  Oracle中删除超过50w条记录的数据,如果直接使用delete,效率就严重受到了影响。那么首先我们需要了解对于这个表的数据,我们到底是全部删除,还是部分删除。这里有三个关键字我们需要注意:truncate,delete,drop,他们之间的异同点可以参考这篇文章——truncate,delete,drop的异同点

  全部删除,不保留数据结构就直接drop最好。如果是部分删除,一般就这样一些办法:

  1. 如果删除的数据是大部分,分段提交删除的数据。

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;

  2、把要保留的数据放在一个临时表里,truncate table原表后再放回来;

create table t_back as select * from t where ….
drop table t;
rename t_back to t;

   3. 专门使用一个大回滚段 ,比如定义:undo tablespace 2G

  4、如果将方法1做一点修改,可以这么做:

有条件的分步删除数据表中的记录 

–创建测试表
create table test as select * from dba_objects;

–创建删除表的存储过程 
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′)

   5、如果确认将来不需要做恢复,改为非归档模式,删除完改回来再做个备份。这个方法我没有实验过。

  推荐使用第四种办法。其实这些东西用google搜索很多,但是都没有注释或者解释。这里做一个小小的总结。

免费的关卡

  近日除了研究GIS的东西外,开始抽上班空闲努力学习Solaris。 还好有台备用的服务器可以让我胡乱折腾,今天折腾到打补丁。门外汉的我老老实实 uname -a SunOS jiaowu-xd 5.8 Generic_108528-13 sun4u sparc SUNW,Sun-Fire-880 108528-13,那么下面的补丁是哪些呢?阅读Patch Reports未果。然后发现了http://updates.sun.com,以为一切就简单到和windows update一样了。几番注册未果,发现这东西就只支持Solaris 10。算了,还是老老实实找补丁。 找相关文章,发现补丁分Cluster和Point的区别,找了个网管中心的同事问了下,让我直接下Cluster就可以了,Point一个个找起来也麻烦。这也好。找到属于自己系统的补丁。下载!…………居然要我登陆,晕倒,遂找刚才的同事要ID/Pwd,他说以前没有要的阿。晕!看看刚才的文章,说可以到FTP直接下载,上去一看—— PATCHES DOWNLOAD HAS BEEN DISCONTINUED FROM THIS FTP SITE!!    * *              (Please use http://sunsolve.sun.com)             晕倒!!!! 算了,我注册。结果又发现要求填写Sun Service Plan (case sensitive) 。再仔细一看,哦,不是必须的,松口气,继续。经过几番注册(实在郁闷,注册的时候所要求填写的东西一概不写规则,我都尽量遵循一般规则了,都让我翻来覆去三次)成了。注意到一个—— NOTE: Full Access to the SunSolve Knowledgebase and restricted Software Updates (patches) require a valid Sun Service Plan. If your Sun Service Plan information needs to be verified, you will be notified via e-mail in 1 to 3 business days regarding your request. 我就下一个补丁麻,饶了我,我不需要那么完整的,能下就可以。登陆后还好可以下载,不然我真的欲哭无泪了。 下面还有Oracle的补丁,我可不希望再如此郁闷了,如果还是如此,那也只得如此了,哎!现在是卖服务的年代!

2006年10月9日生活随笔

1 Comments

self

  忽然有天发现自己根本无法想象现在的自己。 怎么说呢?也不知道什么时候这个想法忽然冒出来的。也许是因为最近理了一个很cool的发型。然后开始想过去的自己,想过去的自己怎么设想未来的自己,结果就是过去的自己,或者说现在的自己,根本无法想象未来的自己。 也许有人清楚自己每走的一步,也许都是在自己的计划范围内。可至少我不是这样。从来没有想过自己现在日常的工作就是不停的和人交流,解决一些和技术根本无关的东西,可这就是工作。为什么到这一步呢?难道是我对技术疲惫了?不是!而是关于自己的发展,也许在国内永远的企事业单位永远逃脱不了的就是提升,什么人可以得到提升?绝对不是技术好而缺乏与人交流经验的人。 所以,我选择了让自己去学习交流。这样的选择有好有坏,喜忧参半,有得有失。也许就因为这样忽然有了这样的想法。 从来没有想过自己要去真正理一个寸头,可现在成真了,呵呵。越来越发现自己外表已经没有了个性,也越来越发现自己的对人开始真假参半…… 不管怎么说,变化就是变化。人生就是在这样的变化中度过。过去的自己,现在的自己,永远来无法设想未来的自己会如何,这就是生活和人生吧。忽然达尔文的——适者生存。出现在自己的脑海里,呵呵。

返回顶部