前几篇blog中整理了关于HWM和delete drop truncate的一些关系。补充一下HWM的另外一些东东。
首先减少HWM的方法上次提到了move和shrink
Alter table test09 move
通过move移动对象,但是move之后,需要重建索引,而且move的过程中会影响在线使用
Alter index indexName rebuild
Move原理是创建一个新表,所以需要两倍的空间,然后将原表的数据插入新的表中,然后在删除原来的表和数据,释放空间。可以看出move的过程中数据行的rowid改变了,所以需要重构索引。
利用shrink在线收缩表内的HWM
Alter table test09 enable row movement
Alter table test09 shrink space
因为使用在线收缩空间shrink space是利用了一系列的dML操作来实现,主要是把HWM最后的块放在HWM最前端。
需要说明的是shrink space需要在表空间自动段空间管理,所以system等表空间无法shrink。
降低HWM shrink需要行迁移:
刚开始不清楚shrink的具体细节,主要是移动数据所在的block,要改变数据行所在的block地址,所以肯定需要行迁移来完成。
闪回也需要行迁移
同样在10g中闪回表也需要开启行迁移,闪回也是利用回滚段进行一系列的dml操作,可能改变rowid地址,此时也需要行迁移来保证rowid不会改变。
Move需要重建index shrink不需要:
Alter table test09 shrink space;此时还对索引进行了维护。如果table的index数量较多,维护起来也需要消耗成本,在业务不繁忙时shrink space。
收缩表时一起收缩索引:
Alte table test09 shrink space cascade;
还有一些降低HWM的方法:
1 rename需要回收表,创建test09同名表然后insert进去
2 导出,truncate,导入
上述方法都是利用重建新段时HWM为0然后插入数据来回收的,适用性有限。
查看数据行实际使用了多少数据块,eygle的提供的sql:
Select count(distinct(substr(rowid,1,15))) from test04
来分析下rowid的东东:rowid由4部分组成。
数据对象编号 文件编号 块编号 行编号
OOOOOO FFF BBBBBB RRR
所以rowid的前15位就可以唯一决定数据行是属于某个数据块,上述sql就可以查看表中数据行实际占用的数据块个数。
测试下shrink space生成的redo
SQL> select name,value from v$statname a,v$mystat b
2 where a.statistic#=b.statistic# and a.name='redo size';
NAME VALUE
---------------------------------------------------------------- ----------
redo size 42568
SQL> alter table test09 shrink space;
Table altered
SQL>
SQL> select name,value from v$statname a,v$mystat b
2 where a.statistic#=b.statistic# and a.name='redo size';
NAME VALUE
---------------------------------------------------------------- ----------
redo size 150236
在测试过程中发现
alter table test09 enable row movement
analyze table test09 compute statistics
开启行迁移和分析表也会产生少量redo。
这两天开始接触了ASM和RAC,本本买了性能不错装个虚拟机,然后装下linux系统来实现下rac和ASM。有心得了跟大家分享!要学习linux了!
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1055213/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25362835/viewspace-1055213/