Data Pump 不能替代 SHRINK SPACE,因其本质是逻辑复制,仅重建对象而不压缩原段、不移动HWM、不释放碎片空间;真正在线收缩段、回收空间必须使用 SHRINK SPACE 或 DBMS_REDEFINITION。
不能直接用 data pump 重新组织表空间段——它不负责段空间整理,只负责对象迁移与数据导出/导入。真正用来收缩段、回收高水位线(hwm)后空闲空间的,是 alter table ... shrink space 或 dbms_redefinition。
为什么 Data Pump 不能替代 SHRINK SPACE?
Data Pump 的本质是逻辑复制:它读取数据行、生成 DDL + INSERT 语句(或直接传输数据块),再在目标位置重建对象。这个过程会新建段,但不会压缩原段、不移动 HWM、不释放原表空间内碎片块。
-
expdp导出再impdp导入,相当于“重建一张新表”,旧表仍占空间,除非你显式DROP原表——这等于绕路做了一次手动迁移,还多出停机窗口和元数据一致性风险 - 导入时若指定
TABLE_EXISTS_ACTION=REPLACE,impdp会先DROP再建,但索引、约束、触发器等依赖对象需重新验证,且无法保证分区结构、虚拟列、LOB 存储子句等完全还原 - 真正需要“在线收缩段”时,
SHRINK SPACE是唯一原生方案;Data Pump 只适合跨库迁移、表空间整体搬迁或逻辑隔离重构
什么情况下 Data Pump 能间接实现“段重组”效果?
当你要把表从一个表空间迁到另一个(尤其是启用了压缩或不同区管理策略的表空间)时,impdp 的重建行为客观上产生紧凑段布局——但这不是“重组织”,而是“换地方重建”。
- 必须启用
TRANSFORM=SEGMENT_ATTRIBUTES:N,否则导入时会沿用原表空间属性,失去重组意义 - 目标表空间需为本地管理 + 自动段空间管理(ASSM),否则
SHRINK不可用,导入后也无法进一步压缩 - 若源表含
ROW STORE COMPRESS BASIC,导入时需显式加COMPRESSION=ENABLED参数,否则默认不压缩 - 分区表要加
PARTITION_OPTIONS=DEPARTITION或GROUP_PARTITION_TABLE_DATA控制导入粒度,否则可能打乱分区键分布
SHRINK SPACE 才是段级重组织的正确入口
想在线回收表内碎片、降低 HWM、释放空间给表空间,必须用 SHRINK SPACE,且前提明确:
- 表所在表空间必须是
LOCAL管理 +AUTO段空间管理(查DBA_TABLESPACES.SEGMENT_SPACE_MANAGEMENT) - 执行前需开启行移动:
ALTER TABLE t ENABLE ROW MOVEMENT,否则报ORA-10636: row movement is disabled -
SHRINK SPACE COMPACT仅整理数据、不释放空间(可用于业务高峰期分步操作);SHRINK SPACE才真正降低 HWM 并归还空间 - 含 LOB 列的表,需额外对 LOB 段单独 shrink:
ALTER TABLE t MODIFY LOB (c) (SHRINK SPACE)
容易被忽略的关键点
很多人以为导一遍就“自动优化”了,其实 Data Pump 不触碰原段结构,也不更新统计信息。哪怕你用 impdp 重建了表,若没手动收集统计信息,优化器仍按旧的 NUM_ROWS 和直方图估算,查询性能可能更差。
真正要解决段碎片,得回到原表本身:确认 ENABLE ROW MOVEMENT、检查表空间类型、评估锁影响(SHRINK SPACE 需短暂独占锁),再决定用 COMPACT 还是完整 SHRINK。Data Pump 只是搬运工,不是整形师。


















