如果Oracle数据库表出现大量碎片数据,则会浪费磁盘空间和严重影响性能。这时可以使用Oracle分段空间管理功能,特别是Oracle数据库分段压缩功能。
更新或删除表的记录,会在数据块中形成许多的空白空间。一些空白空间会被后来插入的记录重用。然而,删除和插入的大小差别会产生极小的碎片空间,以至它们永远也不会被再使用。此外,在一个已经删除大量记录的表中,表分段将在高位线下包含大量的稀疏(或空白)块。这样会大大降低全表扫描的效率。
在线分段压缩功能是Oracle分段空间管理的首选方法,它会回收分段中高位线之下的碎片空闲空间。在线分段压缩操作不同于ALTER TABLE、INDEX或CLUSTER命令的DEALLOCATE UNUSED子句。解除分配操作会直接释放分段中高位线之上的空闲空间。压缩分段会整合高位线之下的碎片空闲空间和压缩数据。高位线将向下移,回收的空间 将会释放。在压缩操作执行之后,分段的数据将保存到较少的块中。这样可以优化缓存使用率,并且减少全表扫描时要读取的块数。
使用分段压缩的Oracle分段空间管理
分段压缩可以在使用表的工作时间执行。它不会影响DML操作或查询,也不需要额外的磁盘空间。在压缩操作结束时,并发DML操作将会暂停一小段时间,这段时间将用于释放一些空间。分段的所有索引都会在压缩操作期间保持不变。在操作完成之后,它们一样保持不变。
压缩操作会在物理上将数据文件的记录移到新位置。要实现这个操作,必须使用ALTER TABLE.ENABLE ROW MOVEMENT命令,启用对象的记录移动。然后,还需要禁用分段中所有基于记录ID的触发器。此外,压缩操作只能在本地管理且启动自动分段空间管理的表 空间的分段上执行。在线分段压缩不支持以下几种分段类型:压缩表、IOT表、SecureFile LOB、有若干功能索引的表及有基于ID的物化视图的表。
要分析在线压缩分段是否会提高分段的运行效率,最简单方法是使用Segment Advisor。Segment Advisor会检查自动负载库的使用率和增长统计信息,并从分段提取抽样数据,从而确定可以回收空间的分段。默认情况下,分析工具会在维护时间内作为一 个自动化维护任务执行。此外,它也可以手动执行。如果分析工具发现一个分段可以回收大量的空闲空间,那么它会建议执行一次在线分段压缩操作。如果对象不适 合执行分段压缩操作,那么它会建议在线重新定义表(也称为重组)。执行在线重定义的最终结果与在线分段压缩很相似。然而,重定义操作在执行过程中需要使用 额外的磁盘空间。
Oracle分段空间管理工作可以压缩表、索引表、索引、分区、子分区、物化视图或物化视图日志的空间。这个操作的执行方式是:在各种ALTER语 句(例如,ALTER TABLE、ALTER INDEX、ALTER MATERIALIZED VIEW或ALTER MATERIALIZED VIEW LOG)中使用SHRINK SPACE子句。此外,SHRINK SPACE子句还有两个可选关键字,它可以控制压缩操作的行为:
COMPAT – 在子句中指定这个参数,就会把压缩分段操作分布两个阶段。数据库会整理分段空间的碎片,压缩表的记录,但是压缩操作不会重置高位线或释放空间。这个参数通 常用在一些没有长查询操作的数据库,这些表查询可能会跨越多个操作,它们会试图从回收块中读取数据。在数据库活动较少的时候,数据库会执行第二个 SHRINK SPACE操作完成整个过程,但是这一次命令不带COMPAT关键字。
CASCADE – 这个参数会让分段压缩操作在对象的所有独立分段上执行。例如,压缩一个表时添加CASCADE,就会在表的所有索引上执行分段压缩操作。
--转自