浅谈Oracle的高水位线--HWM(三)

2014-11-24 12:34:56 · 作者: · 浏览: 3
过data_object_id来确定块是在HWM和LHWM的位置
那么Oracle为什么要增加低高水位设置?出于什么目的?全表扫描时,是到低高水位,
还是到高高水位?
Oracle设计有一个原则,就是把一个大操作分散到很多小操作中,以保证某个大操作不会
花费太长时间
无论是延迟提交,还是什么,都体现了这种思想,这和 Linux的理念有异曲同工之妙哦
而低高水位线与高高水位线结合,正是这种思想的体现
可以不用一次性格式化所有新分配的块,留一部分给下次操作来完成
全表扫描时,通常都是读至低高水位线,然后根据位图去读低高与高高之间格式化过的块,
避开未格式化的块
如何查看HWM?如何知道HWM下有多少空闲的空间?
最实用的方法就是dump segment_header,速度快,而且对应用没有影响
而且,trc里面的"#blocks in seg. hdr's freelists:"可以告诉我们HWM下有多少空闲块
这里需要注意,如果dba_segments.freelist_groups > 1,那么freelist不再segment header中
比如,freelist_group = 3 ,则你便要分别dump header后面的3个块,来看每个group
的freelist的个数
那么如何降低HWM呢? www.2cto.com
① expdp/impdp
② 10G及以后的版本可以采用shrink,需要注意的是,表所在表空间须为自动段空间管理
alter table tab_name enable row movement;
alter table tab_name shrink space;
③ 使用move,不过在Move期间,会影响到DML语句,如UPDATE,也需要考虑空间问题
总之move会锁表 而且是TM 另外还会影响index,所以,之后记得rebuild index
alter table move tab_name; 在当前表空间中move
alter table move tab_name tablespace tbs_name; 将其move到其他表空间
④ CTAS 然后rename,rebuild index
⑤ 在线重定义
等等.......