oracle删除上亿条数据,记录数过亿条的表数据维护-数据删除

当一张表数据很大的时候,由于数据删除的时候时间会很长,事务很大,所需的undo段将会比较大,未提交的话,undo段数据会受到保护,这将影响其它事务的操作-执行时间会变长或者挂起,所以删除大表数据的时候尽量将大事务切分成小事务去做,下面的存储过程是删除表数据时没10万行一提交。

declare

cursor cur is select rowid from tab1 where   xx

type rowid_table_type is  table  of rowid index by pls_integer;

v_rowid   rowid_table_type;

BEGIN

open cur;

loop

fetch   cur bulk collect into v_rowid  limit 100000;

exit when v_rowid.count=0;

forall i in v_rowid.first..v_rowid.last

delete from tab1 where rowid=v_rowid(i);

commit;

end loop;

close cur;

END

数据删除结束后,表的实际存储空间未被释放,这时需要需要对数据段进行收缩,如下

要使用assm上的shink,首先我们需要使该表支持行移动,可以用这样的命令来完成:

SQL> alter table tab1 enable row movement;

现在,就可以来降低tab1的HWM,回收空间了,使用命令:

SQL> alter table my_objects shrink space;(次操作尽量放到系统空闲的时候去做)。

空间收缩后,由于表的数据比较大,此时应该收集优化器统计信息,以使优化器做出正确的执行计划选择。

exec dbms_stats.delete_table_stats(ownname=>'user_name',tabname=>'table_name',cascade_indexes=>true);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle可以通过存储过程循环删除数据。存储过程是在数据库中存储的一段SQL代码,可以被重复调用。以下是一个示例的存储过程,用于循环删除数据。 首先,我们需要定义一个存储过程,接受参数来控制删除的行数和删除的条件: ``` CREATE OR REPLACE PROCEDURE delete_data(p_num_rows IN NUMBER, p_condition IN VARCHAR2) IS v_total_rows NUMBER; v_deleted_rows NUMBER := 0; BEGIN SELECT COUNT(*) INTO v_total_rows FROM your_table WHERE your_condition; WHILE v_deleted_rows < p_num_rows AND v_deleted_rows < v_total_rows LOOP DELETE FROM your_table WHERE your_condition AND ROWNUM = 1; v_deleted_rows := v_deleted_rows + 1; END LOOP; COMMIT; -- 提交删除操作,将更改持久化 END; / ``` 然后,我们可以调用该存储过程来执行删除操作: ``` BEGIN delete_data(100, 'your_condition'); -- 删除100行满足条件的记录 END; / ``` 在上述示例中,存储过程`delete_data`接受两个参数:`p_num_rows`指定要删除的行数,`p_condition`指定删除的条件。首先,我们通过`SELECT COUNT(*)`语句获取总行数。然后,在`WHILE`循环中不断删除满足条件的记录,直到删除的行数达到指定的行数或达到总行数为止。每次删除一行后,我们使用计数器`v_deleted_rows`记录删除的行数,并使用`COMMIT`语句将删除操作持久化。 使用存储过程循环删除数据Oracle数据库管理中的常见操作。通过存储过程,我们可以灵活地控制删除的行数和删除的条件,提供了更好的可重复性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值