一个资料库,数据容量总计为450GB.两个最大的表有6000万条记录
其中一个表字段数为65个,单条记录尺寸为1k--1.5k, 没有大对象(LOB).
现在需要通过其中的两个字段作为条件(已在其中建有索引),删除约50条记录.
数据库平台为RS6000 S7A, 内存2048M, CPU:4*262MHZ. Orace8.1.5Enterprise
尝试过在小型机以脚本方式执行匿名块:
但下述脚本持续使用同一个回滚段,且不断增长,达10G, 最终因回滚段表空间
无法再分配下一下extent而失败. 怎样解决这种占用产生大量回滚实体的问题?
#!/bin/sh
svrmgrl << EOF
connect username/password;
alter table tb_name nologging;
declare
v_id tb_name.id%type;
v_counter number:=0;
v_total number :=0;
cursor V_Cur is
select rkxh from tb_name where f_a=xxx and f_b=yyy;
begin
open V_Cur;
loop
fetch V_Cur into v_id;
exit when V_Cur%notfound;
v_counter:= v_counter+1;
delete from tb_name where id=v_id;
v_total:= v_total + 1;
if v_counter>=10000 then --10000条提交一次
commit;
v_counter := 0;
end if;
end loop;
commit;
close V_Cur;
exception
when others then
rollback;
close V_Cur;
end;
/
alter session disable parallel dml;
alter table tb_name logging;
disconnect
exit
EOF
其中一个表字段数为65个,单条记录尺寸为1k--1.5k, 没有大对象(LOB).
现在需要通过其中的两个字段作为条件(已在其中建有索引),删除约50条记录.
数据库平台为RS6000 S7A, 内存2048M, CPU:4*262MHZ. Orace8.1.5Enterprise
尝试过在小型机以脚本方式执行匿名块:
但下述脚本持续使用同一个回滚段,且不断增长,达10G, 最终因回滚段表空间
无法再分配下一下extent而失败. 怎样解决这种占用产生大量回滚实体的问题?
#!/bin/sh
svrmgrl << EOF
connect username/password;
alter table tb_name nologging;
declare
v_id tb_name.id%type;
v_counter number:=0;
v_total number :=0;
cursor V_Cur is
select rkxh from tb_name where f_a=xxx and f_b=yyy;
begin
open V_Cur;
loop
fetch V_Cur into v_id;
exit when V_Cur%notfound;
v_counter:= v_counter+1;
delete from tb_name where id=v_id;
v_total:= v_total + 1;
if v_counter>=10000 then --10000条提交一次
commit;
v_counter := 0;
end if;
end loop;
commit;
close V_Cur;
exception
when others then
rollback;
close V_Cur;
end;
/
alter session disable parallel dml;
alter table tb_name logging;
disconnect
exit
EOF
解决方案 »
- oracle导入数据出错:imp 00058:ora-12154:tns:无法连接指定的连接标识符
- 新建一个数据库里,系统默认帮新建了一些表,用PLSQL Developer打开怎么隐藏这些表
- ERROR - ORA-00001: 违反唯一约束条件
- oracle sql 语句 查询 从 n到m的记录
- oracle在java存储过程中如何创建和删除 txt文件呢,是否需要授权呢
- decode替换 有空格问题
- 求征SQL语句
- oracle日期问题.
- 存储过程中的select into问题,请帮忙!!!
- 关于新旧数据库间的数据导入
- 关于以前在客户端所进行的数据处理工作转到服务器端执行的问题
- RMAN备份与恢复 SOS
alter session enable parallel dml;
alter table tb_name nologging;.....
select id from tb_name where f_a=xxx and f_b=yyy;
要操作的表已在别的字段是作了范围分区(Range Partition),在每个分区中再根据另一字段作hash subpartition. 但删除与查询语句的条件子句中,均不带分区关键字.
我的问题关键不是慢,我通过select count(id) from tb_name where f_a=xxx and f_b=yyy; 查询50万条记录很快的. 问题在于无法做删除,同一个回滚段RBS1 持续增长到
甚至10G,以致撑暴了回滚表空间. 根据计算,50万条记录连带所有相关的索引,总共占用的
Oracle Block 大小不会超过2GB的. 有哪位大哥有类似删除大指的经验吗?
and rownum <= 10001;
commit; In fact , I am still confusing . But anyway please try and feedback us whether the result is getting better .
1。
我觉得楼主的V_Cur 很大,
而且每条都要delete from tb_name where id=v_id;
这样是不是要扫描50万*50万遍?
2。
if v_counter>=10000 then --10000条提交一次
commit;
v_counter := 0;
v_counter 一直都为0或1,
哈哈 所以回退段不够用。declare
i integer;
begin
loop
execute immediate 'delete from tb_name f_a=xxx and f_b=yyy,romnum<5000';
commit;
select count(*) into i from tb_name f_a=xxx and f_b=yyy;
exit when i=0;
end loop;
end;
i integer;
begin
loop
execute immediate 'delete from tb_name f_a=xxx and f_b=yyy and romnum<5000';
commit;
select count(*) into i from tb_name f_a=xxx and f_b=yyy;
exit when i=0;
end loop;
end;
我经常来csdn的,但发帖子问问题还是第一次,不蛮懂规矩,只给了5分,望各位包涵.
特别谢谢龙飞虎、一品黄山! #!/bin/sh
svrmgrl << EOF
connect username/password;
alter table tb_name nologging;
alter session enable parallel dml;
begin
for i in 1..100
loop
delete/*+parallel(tb_name,4)*/ from tb_name where f_a=xxx and f_b=yyy and rownum<=5000;
commit;
end loop;
end;
/
alter session disable parallel dml;
disconnect
exit
EOF