最近在进行数据迁移时需要修改部分表的pctfree和initrans参数,因此对修改的方式进行了讨论。
pctfree参数增大会使数据块的空闲空间同步增加,块的使用率就会下降。但是直接修改已有表的pctfree和initrans参数参数,针对已有块的空闲空间是不会改变的,例如:当前表的pctfree设置为10,手工调整为20后,表使用的块的数量是不会改变的。
有两种方式可供选择:
(1)先在新的数据库中新建表,建表是将pctfree和initrans参数设置为需要的值,再用数据泵的方式将原始库导出,增量的方式导入新库;
(2)直接在原始库上对表结构进行修改,再通过数据泵的方式进行导出导入。
针对第一种方法是肯定没有问题的,但是操作起来不太方便。个人比较倾向于第二种方法,但是由于数据泵是采用块数据搬迁的方式进行导出的,所以不清楚导入以后块的空闲空间会不会改变,因此进行了测试。
测试步骤:
(1)找一张数据量在20M左右的表,其pctfree=10,我测试的表名为A;
(2)新建一张表B,其pctfree=20,其余与A表相同;
(3)执行INSERT INTO B SELECT * FROM A;
(4)将A的pctfree修改为20,并通过数据泵导出A表;
(5)将A表的名称修改为C(避免数据泵导入时重复);
(6)数据泵导入A表。
查询表情况,结果如下
SEGMENT_NAME BYTES BLOCKS
表名 目前占用的大小 占用了多少个block
C 22020096(21MB) 2688
B 26214400(25MB) 3200
A 26214400(25MB) 3200
通过上表可以看出两种方式迁移数据后,其表大小与所占数据块是一致的,说明数据泵导入时其pctfree已经生效,新数据库的数据存储没有完全照搬老的数据块。
以上纯属个人简介,不对之处请指教。