本案例适用于那些超大型表,这一类表本身体积巨大,包含了大量的区(Extent)。对于主机CPU性能不是很强的环境,仅仅通过DROP命令是很难一次性完成删除任务,因为时间不允许。我们可以采用“分而治之”的策略高效地完成这类表的删除任务。
这是一个CPU密集型的操作,CPU主要消耗在对区的整理上。对于主机CPU性能不是很强的环境,需要提前做好准备。
我们可以模拟一下这种类型的表。
1.创建测试表T
sec@ora10g> create table t as select * from all_objects;
Table created.
2.初始化大量数据
使用如下简单插入语句反复向表T中插入数据。
insert into t select * from t;
commit;
3.最后的确认表T所占用区大小
sys@ora10g> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,BYTES/1024/1024 MB,EXTENTS from dba_segments where SEGMENT_NAME='T';
OWNER SEGMENT_NAME SEGMENT_TYPE MB EXTENTS
---------- --------------- ------------------ ---------- ----------
SEC T TABLE 1856 212
表T大小近2G,占用区212。这个例子不是很典型,最佳的实例使用了成千上万的区。
4.“分而治之”完成表T的删除
三步走。
1)使用具有REUSE STORAGE选项的TRUNCATE命令清除表数据
conn sec/sec
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> truncate table t reuse storage;
Table truncated.
2)分阶段回收空间
找到合适的维护窗口分阶段完成空间的回收。
sec@ora10g> alter table t deallocate unused keep 1000m;
Table altered.
sec@ora10g> alter table t deallocate unused keep 500m;
Table altered.
sec@ora10g> alter table t deallocate unused keep 100m;
Table altered.
3)删除表
sec@ora10g> drop table t purge;
Table dropped.
5.小结
在具有海量数据的生产环境中,对那些超大型的表的处理方法往往没有想象中的那种简单。做好知识储备,针对具体场景做出正确的选择。建议在对生产环境进行调整之前在测试环境中能够模拟一遍,这样可以极大的降低贸然行动带来的损失。
Good luck.
secooler
11.04.20
-- The End --
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-693829/,如需转载,请注明出处,否则将追究法律责任。