适用版本:11gR2、12c、19c、23c
目标:将普通堆表(非分区)在线 / 离线转换为分区表,保留数据、索引、约束、依赖
一、适用场景
- 表数据量大、查询慢、删除历史数据困难
- 需要按时间 / 地区 / 类型做分区裁剪、分区交换、分区归档
- 运维需要:快速删除分区、备份分区、优化 IO
二、普通表转分区表 5 种主流方法
按推荐优先级排序:
方法 1:DBMS_REDEFINITION(在线重定义)【企业首选】
优点:
✅ 在线转换、业务几乎不停
✅ 保留索引、约束、触发器、权限
✅ 支持分区键任意选择
✅ 11g 及以上通用
缺点:
需要额外存储空间(原表 1 倍)
核心步骤:
- 检查是否可重定义
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('USER','TABLE'); - 创建目标分区表(空表)
- 开始重定义
sql
EXEC DBMS_REDEFINITION.START_REDEF_TABLE(...); - 同步数据(可选多次)
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE(...); - 完成重定义
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(...);
适用:生产核心表、不能停机。
方法 2:CREATE TABLE ... AS SELECT + 交换分区(CTAS + EXCHANGE)
最快、最简单,适合停机窗口允许的场景。
步骤:
- 创建分区表(结构相同)
- 插入数据
INSERT INTO 分区表 SELECT * FROM 原表; - 重建索引、约束
- 改名切换(可选)
优点:简单、速度快
缺点:停机、需重建索引约束
方法 3:Exchange Partition(分区交换)【超快】
适合:原表数据就是一个分区的范围(如全是 2025 年)
步骤:
- 建分区表(含对应分区)
- 交换分区(秒级)
ALTER TABLE 分区表 EXCHANGE PARTITION p2025 WITH TABLE 原表;
优点:秒级、几乎无 IO
缺点:数据必须刚好匹配一个分区
方法 4:EXP/IMP 或 EXPDP/IMPDP(数据泵)
适合:跨版本、跨平台、大表迁移 + 分区改造一起做
步骤:
- 目标库建分区表
- 导出原表
- 导入到分区表(PARTITION_OPTIONS)
优点:安全、可断点续传
缺点:慢、停机
方法 5:Oracle 12cR2+ 新特性:ALTER TABLE ... MODIFY TO PARTITION
12cR2 最爽语法:一行命令转分区
ALTER TABLE table_name
MODIFY TO PARTITION BY RANGE (create_time)
(
PARTITION p2024 VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD')),
PARTITION p2025 VALUES LESS THAN (MAXVALUE)
) ONLINE;
优点:
✅ 在线
✅ 一行命令
✅ 保留索引约束
✅ 官方最佳
缺点:需 12cR2 及以上
三、方案对比表(最实用)
表格
| 方法 | 在线 | 难度 | 速度 | 版本 | 推荐度 |
|---|---|---|---|---|---|
| 12cR2 ALTER 转分区 | ✅ | 极低 | 快 | 12cR2+ | ⭐⭐⭐⭐⭐ |
| DBMS_REDEFINITION | ✅ | 中 | 中 | 11g+ | ⭐⭐⭐⭐ |
| CTAS + INSERT | ❌ | 低 | 快 | 全版本 | ⭐⭐⭐ |
| Exchange Partition | ✅ | 低 | 极快 | 全版本 | ⭐⭐⭐⭐ |
| EXPDP/IMPDP | ❌ | 中 | 慢 | 全版本 | ⭐⭐ |
四、转换前必做检查(重要)
- 表是否有主键(重定义需要)
- 空间是否足够(1.5~2 倍原表)
- 选择分区键:时间字段优先
- 禁止业务 DDL 期间操作
- 提前备份表
- 转换后重建 / 验证索引
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




