通常做为DBA的我们来说,对于表的维护主要是做以下的工作
1. 增加表所在表空间的大小
我们所创建的表都是存储在表空间中的,当表空间的创建属性是自动扩展的时候,通常我们不需要人为干预,表中的数据量持续增长,会使表空间的可用空间减少,表空间会自动增长,这会带来一定的性能上的影响,表空间的自动扩展直接操作物理磁盘,将增加的表空间格式化成可用于写数据的数据块。同时也会导致数据文件疯狂增大的可能,不好管理,所以建议将表空间的属性设置成手动扩展。
2. 表的碎片整理
有时候会遇到将一个表中大量的历史无用数据删除掉,这时候就会产生数据块级别的碎片,所谓的碎片就是说:每个数据块中含有的数据很少,但并且一个数据分散在多个这样的数据块中。
产生这种现象的原因是:
表上有大量的insert 和delete 在表的段头中记录的一个值-HWM(high water mark)这个高水位线表示当前的段里面使用的最后一个数据块的位置,当发生insert的时候增加hwm的值,和水位上涨的道理差不多的。
当删除一些数据的时候,块儿中的数据被删除,但是HWM并不会下降。HWM的好处是:当发生全表扫描的时候,只会扫描到标记HWM的地方为止,如果没有HWM标记,就会导致扫描所有有使用的和未使用的数据块,性能很低下。有了这个标记,就扫描到HWM出现为止。
delete操作,并不会使HWM下降。所以在有数据写进来的时候HWM的值还是会增加的,长时间下去会导致数据文件很大,空间浪费。
解决方法:
在Oracle 9i的时候通常的做法是将表做一个move操作
历史
iis7站长之家 table tablename move;
把表移动一下,这个操作会使表的索引全部失效,所以会造成一定的影响
这时候可以重建索引
alter index index_name rebuild online;
还有就是将表exp/imp 导入导出操作;
为了减少对应用的影响10g的版本可以使用shrink,这种方式的收缩操作是通过事物老进行的,因此在收缩的过程中,表可以进行DML操作,当然如果对正在收缩的表进行DML操作,需要等待收缩引起的是事物完成,并释放锁。要对表收缩需要有两个前提条件:
1. 表所在的表空间必须使用ASSM
2. 表级别上需要启用行迁移row movement
alter table tablename enable row movement;
压缩数据,并不下降HWM
alter table tablename shrink space compact;
收缩表并下降 HWM
alter table tablename shrink space;
收缩表并下降HWM同时和表相关的索引等会同时收缩
alter table tablename shrink space cascade;