大部分情况下,笔者都是利用ALTER TABLE MOVE语句来重新组织表。如可以利用这条语句,将某个表移动到同一个表空间的新数据段中。移动以后这对于用户来说是没有任何影响的。但是却可以重建表的存储结构,从而减少碎片,优化性能。当然,也可以利用这个语句把现有的表移动到其他的表空间中去。不过在使用这个语句的时候,数据库管理员还是需要注意几个限制。
一是在使用这条语句中要注意有足够的空闲空间;如果在同一个表空间进行移动的话,则需要主要表空间能够容纳这个数据。这注意是因为,这个操作就好像是两个操作结合而完成的一项操作。其首先将这个表复制到指定的位置,然后再删除原来的表。也就是说,直到表被完全移到新的数据段中之后,数据库才会删除原来的数据段。所以这个空闲空间一定要保证,否则的话,就可能导致这个作业无法顺利完成。
二是在利用这个语句重新组织表的过程中,原表的ROWID会发生改变。而这个值改变后最大的影响就会使得表中的索引失效。为此在使用这个语句重新组织表之后,就需要对此表重新建立索引。这也就是说,在短时间内用户使用这个表会受到一定的影响。为此在执行这个操作的时候,最好能够选择数据库比较空闲的时候。如果在执行这个语句时能够暂时中断用户的连接,那时最好的。
数据库管理员可以通过数据字典来查询存储空间的碎片状态。如果碎片确实比较多的话,在笔者推荐使用这个语句来重新组织表,以减少碎片空间。如果整个数据库存储空间中都分布着大量的碎片,而不是个别表的问题,那么就需要采用数据泵工具来重新组织全部的表,在最大程度上减少碎片。