攻略1-19 释放未使用的表存储空间

问题描述

你通过分析段顾问的输出,发现一张表有大量的闲置空间。你想要释放这些未使用的空间,以提高对这张表执行全表扫描的查询性能。

解决方案

按照下面的步骤来收缩空间,并重新调整表的高水位线:

(1) 启用这张表的行迁移;

(2) 使用ALTER TABLE...SHRINK SPACE语句来释放未使用的空间。

注意 收缩表功能要求表所在的表空间使用自动段空间管理。关于创建支持ASSM功能表空间 的详细信息,请参见攻略1-2。

在对一张表进行收缩时,就需要移动数据行(如果有的话)。这意味着必须启用行移动。:

enter image description here

工作原理

收缩一张表时,Oracle会以占用最小存储空间的方式来重新组织数据块。同时Oracle还会重新调整表的高水位线。这对全表扫描查询的性能是很有意义的。在这些场景下,Oracle将会查看所有位于高水位线之下的数据块。如果你注意到一个查询需要很长时间才能返回结果,而表中并没有很多数据行时,就有可能是在高水位线之下存在很多闲置的数据块(由于其中的数据被删 除了)。

你也可以命令Oracle在收缩表时不要重新调整高水位线。这可以通过COMPACT子句来实现的,例如:

enter image description here

如果使用了COMPACT,Oracle会整理表的碎片但不会调整高水位线,需要使用ALTER TABLE...SHRINK SPACE语句来重新设置高水位线。你可能想这样做,因为你很在意整理碎片和调整高水位线所花的时间。这样一来,通过两个较短的步骤,无需花费很长时间就可以对表进行收缩。

当为表启用了数据行移动,Oracle就可以修改需要移动的任何一条记录的ROWID。这表示Oracle同时也必须维护引用这些ROWID的索引。因此要记住,收缩表的性能与需要移动的数据行数和需要更新的索引相关。

除了“解决方案”部分所给出的方法之外,还有两种方法可以用来释放高水位线之下的空闲空间:

 截断表; 
 移动表; 
 使用数据泵导出表,删除表,然后再重新导入表。 
当然,如果需要永远移除表中所有数据的时候,使用TRUNCATE。如果表中已经是0行数据,截断表也是可以接受的。

也可以通过移动表来降低高水位线。例如:

enter image description here

如果移动一张表,需要确保重建相关的索引,因为移动运算将会改变表中数据行的ROWID,使得索引失效。

数据泵技术包含导出表,然后删除或重命名现有表,再将表从导出文件中导入的步骤。关于如何使用数据泵技术的详细信息,请参考Pro Oracle Database 12c Administration或Oracle技术网站上的Oracle’s Utility Guide。

目录