记录数过亿条的表数据维护-数据删除
对一些big table,由于数据删除的时候时间会很长,事务很大,所需的undo段将会比较大,未提交的话,undo段数据会受到保护,这将影响其它事务的操作-执行时间会变长或者挂起,所以删除大表数据的时候尽量将大事务切分成小事务去做,下面的pl/sql 匿名块是删除表数据时每10万行一提交。
1 declare
2
3 cursor cur is select rowid from tab1 where xx<nnn order by rowid;
4
5 type rowid_table_type is table of rowid index by pls_integer;
6
7 v_rowid rowid_table_type;
8
9 BEGIN
10
11 open cur;
12
13 loop
14
15 fetch cur bulk collect into v_rowid limit 100000;
16
17 exit when v_rowid.count=0;
18
19 forall i in v_rowid.first..v_rowid.last
20
21 delete from tab1 where rowid=v_rowid(i);
22
23 commit;
24
25 end loop;
26
27 close cur;
28
29 END
30
31
注:数据删除结束后,表的实际存储空间未被释放,这时需要需要对数据段进行收缩,如下要使用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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2016-09-19 linux查看网卡吞吐量和网卡流量用自带命令,iptraf查看。
2016-09-19 浅谈局域网ARP攻击的危害及防范方法(图)
2016-09-19 linux查看网卡个数及速度