一、概念:
ORACLE用HWM来界定一个段中使用的块和未使用的块。创建一个表时,oracle会为这个对象分配一个段,第一区的第一个块被称为段头块(segment_header),
hwm信息就存储在此。hwm线之下表示用过的块,之上已分配从未使用。插入数据,现有空间不足进行扩展水位线向上移,但是删除数据不会往下移。
HWM通常增长幅度是一次5个数据块,如果使用truncate命令,HWM会重新置为0
二、shrink space
可以收缩高水位;索引不需要重建会自动维护;可以在线操作 不影响DML操作
alter table xx enable row movement; #开启表行迁移
alter table xx shrink space; #整理碎片并回收空间,两阶段,数据重组和HWM调整
alter table xx shrink space compact; #第一阶段数据重组,只整理碎片,不回收空间。
alter table xx shrink space cascade; #等同于不加参数的效果
alter table xx disable row movement; #关闭表行迁移
三、move table
高水位以下合并碎片,不移动高水位;move不能在线操作;move后索引失效需要重建;会阻塞DML
alter table xx move;
1.先逻辑备份待整理的表
2.对于大表,建议开启并行和nologging(减少生成redo,不生成undo)
alter table test move nologging parallel 2;
3.整理完重建索引
alter index xx rebulid nologging parallel 2;
4.恢复表和索引的并行度、logging
alter table test logging parallel 1;
四、create table XXX as select * from abb;
这个语句主要用于数据复制,并不直接整理原表的碎片
五、常见问题解答
问题1:发出一个全表扫描,oracle必须一直扫描到HWM吗?
解答:当执行一个全表扫描时,Oracle会读取从表的第一个数据块到HWM之间的所有数据块,即使表里没有数据。
问题2:数据库正常insert插入数据在hwm以下写入,如果在hwm以上插入数据怎么做?
解答:使用append,插入会在HWM上面插入,在高水位上分配空间,不会在表的空闲块中插入。
问题3:insert /*+ append */ 作用
解答:使用APPEND
提示时,数据会直接在HWM之上分配新的数据块,并更新HWM。这意味着它不会尝试在表的空闲块中插入数据,而是直接跳过这些块。
问题4:append直接路径插入会减少redo吗
解答:直接路径插入会绕过Oracle的缓冲区缓存(Buffer Cache),直接将数据写入数据文件。这种写入方式减少了与缓冲区缓存相关的日志记录操作,从而减少重做日志的产生。
问题5:怎么减少日志的产生?
解答:归档模式下append+table nologging会大量减少日志,非归档模式下只要使用append就会大量减少日志。