最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle普通表如何在线转换为分区表
时间:2026-08-18 09:50:49 编辑:袖梨 来源:一聚教程网
DBMS_REDEFINITION 是 Oracle 12c+ 唯一支持在线、安全、兼容复杂结构的分区转换方式;ALTER TABLE MODIFY PARTITION BY 限制极多,如不支持 LIST/HASH/INTERVAL 分区、虚拟列作分区键等,易报错或静默失败。
DBMS_REDEFINITION 是 Oracle 12c 及后续版本中唯一能真正在线、安全、兼容复杂结构的转换方式。别指望 ALTER TABLE ... MODIFY PARTITION BY 一招搞定——它在多数生产表上会直接报错或静默失败。
为什么不能直接用 ALTER TABLE MODIFY PARTITION BY?
这个语法看着省事,但实际限制极严,踩坑成本远高于写几行 PL/SQL:
-
ALTER TABLE ... MODIFY PARTITION BY RANGE不支持LIST、HASH或INTERVAL分区类型 - 分区键列不能是
GENERATED ALWAYS AS虚拟列(比如你的TOTAL_AMOUNT) - 若原表某列为
NOT NULL但无DEFAULT,而新分区键列允许空值,立刻触发ORA-14097 -
UPDATE INDEXES子句对全局索引极其敏感:没显式列出依赖唯一约束的索引?ORA-14098直接中断 - 表上有物化视图日志、
REF列或审计策略?该语法直接拒绝执行
CAN_REDEF_TABLE 返回成功 ≠ 表真能重定义
执行 EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SZR', 'CUSTOMER_ORDERS') 成功,只说明基础结构合规。你还得手动确认这几件事:
- 表必须有主键(如
ORDER_ID),且主键列定义里不能含DEFAULT CUSTOMER_ORDERS_SEQ.NEXTVAL或SYSTIMESTAMP—— 触发器逻辑可以,但 DDL 默认值写法不行 - 检查是否有
ROWID引用、高级队列表依赖,或启用了DBMS_FLASHBACK_ARCHIVE等策略;这些会让COPY_TABLE_DEPENDENTS失败 - 预留空间:临时中间表 + 原表数据 ≈ 2×原表大小;
TEMP表空间也要够(同步阶段大量排序用)
中间表建表最容易错的三个细节
中间表不是复制粘贴原 DDL 就完事。稍不注意,START_REDEF_TABLE 就会抛 ORA-14197 或导致数据不一致:
- 字段定义必须完全一致:包括长度单位(
VARCHAR2(120)和VARCHAR2(120 CHAR)被视为不同类型) - 分区键列(如
ORDER_DATE)不能加NOT NULL约束,除非原表对应列也强制非空;否则START_REDEF_TABLE直接报错 -
不要自己建索引、约束、触发器——全部交给
COPY_TABLE_DEPENDENTS同步;你手动建了,后续会冲突或丢失
示例中间表语句(注意 PARTITION BY RANGE 和边界写法):
CREATE TABLE SZR.CUSTOMER_ORDERS_PART (ORDER_IDNUMBER PRIMARY KEY,ORDER_DATEDATE NOT NULL,CUSTOMER_ID NUMBER NOT NULL,CUSTOMER_NAME VARCHAR2(120),PRODUCT_CODEVARCHAR2(50),QUANTITYNUMBER(8),UNIT_PRICENUMBER(12,2),TOTAL_AMOUNTNUMBER(14,2) GENERATED ALWAYS AS (QUANTITY * UNIT_PRICE) VIRTUAL,ORDER_STATUSVARCHAR2(20) DEFAULT 'PENDING',CREATED_BYVARCHAR2(60)) PARTITION BY RANGE (ORDER_DATE) (PARTITION P_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')),PARTITION P_2025 VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD')),PARTITION P_MAXVALUES LESS THAN (MAXVALUE));
重定义后必须手动收集统计信息
DBMS_REDEFINITION 不会自动更新新表的统计信息,查询计划可能严重劣化:
- 执行
DBMS_STATS.GATHER_TABLE_STATS时,务必指定cascade => TRUE,否则索引统计信息不会被采集 - 如果原表有直方图,要显式传入
method_opt参数复现,否则分区键列选择性误判会导致执行计划出错 - 建议在业务低峰期执行,并监控
DBA_TAB_STATISTICS确认LAST_ANALYZED时间已更新
最常被忽略的是:重定义完成后的原子交换(FINISH_REDEF_TABLE)看似结束,但统计信息缺失会让应用性能陡降——这点比空间和权限问题更隐蔽。
相关文章
- 《明日之后》寻百年非遗浪漫,簪一枝绝美春色! 08-18
- 三角洲行动S9赛季强势冲锋枪代码推荐 08-18
- CF手游武器大师新年广场如何熟练操作各种枪械 08-18
- 《无限暖暖》「点染丰饶之梦」「粉红缎带之舞」限定共鸣复刻开启 08-18
- 小米万兆路由器WiFi 7固件升级教程(小米万兆路由器WiFi 7固件升级教程) 08-18
- 众筹近70亿 开发超十余年!《星际公民》仍未正式上线 08-18