Answers:
删除记录时,没有任何内容会自动压缩段,因此您需要缩小段以回收空间。以下摘录自《 11.2 回收浪费空间管理员指南》:
随着时间的流逝,对表空间内对象的更新和删除会创建空白空间,这些空白空间各自的大小不足以重新用于新数据。这种类型的空白空间称为零碎的可用空间。
具有零散的可用空间的对象会导致大量的空间浪费,并可能影响数据库性能。进行碎片整理和回收该空间的首选方法是执行在线段收缩。此过程合并了高水位线以下的零散自由空间,并压缩了该段。压实后,高水位线将移动,从而在高水位线上方产生新的自由空间。然后将高水位线以上的空间重新分配。在大多数操作期间,该段仍可用于查询和DML,并且不需要分配额外的磁盘空间。
在同一页面上,您可以阅读以下内容:
段收缩是一种在线的就地操作。可以在段收缩的数据移动阶段发出DML操作和查询。当释放空间时,并发DML操作在收缩操作结束时会短暂阻塞。索引在收缩操作期间保持不变,并在操作完成后仍然可用。段收缩不需要分配额外的磁盘空间。
段收缩可回收高水位线上方和下方的未使用空间。相反,空间释放仅在高水位线以上回收未使用的空间。在收缩操作中,默认情况下,数据库会压缩段,调整高水位线并释放回收的空间。
该页面包含有关该问题的更多信息,包括示例。
概念指南中的“细分空间和高水位线”部分可能也很有用。
是的,这是由于碎片。
要回收空间,请首先使用以下查询获取表空间中的表列表(忽略分区-如果正在使用它们,请编辑问题):
select distinct table_name from dba_tables where tablespace_name = 'DATA';
然后为每个表启用行移动:
alter table TABLEINDATAPARTITION enable row movement;
然后可以缩小表:
alter table TABLEINDATAPARTITION shrink space;
然后使用以下方法收缩数据文件:
alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;
数据文件名称可以从DBA_DATA_FILES
您已经知道的视图中获取。