automatic list partition 是 oracle 12c 起支持的 list 分区自动扩展机制,插入未定义值时自动创建新分区;仅适用于国家代码等离散枚举字段,需同时满足三条件:显式 list(col)、带 automatic 关键字、至少一个非 default 初始分区。
automatic list partition 是什么,什么时候该用它
Automatic List Partition 不是独立语法,而是 Oracle 12c 引入的 LIST 分区的一种自动扩展能力——当插入的数据值在现有分区中找不到匹配时,数据库能自动创建新分区(前提是用了 AUTO 关键字)。它只适用于明确知道分区键取值离散、但无法提前穷举全部可能的场景,比如国家代码、状态码、业务线代号这类枚举型字段。别拿它去处理时间字段或用户输入文本,那会触发大量无效分区,拖慢 DDL 和优化器决策。
怎么启用 Automatic List Partition(必须写的三处)
启用不是开个参数就行,得在建表时三处同时满足:
- 分区类型必须显式写成
LIST (col),不能省略括号或写成LIST COLUMNS - 必须带
AUTO关键字,即PARTITION BY LIST (col) AUTOMATIC - 至少定义一个初始分区,且该分区不能是
DEFAULT;DEFAULT分区与AUTO互斥
错误示例:CREATE TABLE t (c VARCHAR2(2)) PARTITION BY LIST (c) AUTOMATIC (PARTITION p_def VALUES (DEFAULT)) —— 这会报 ORA-65008: Automatic list partitioning cannot be used with a DEFAULT partition。
插入数据时自动建分区,但你可能没意识到它干了啥
第一次插入一个未定义的值(比如分区键为 'DE',但当前只有 'US' 和 'CN' 分区),Oracle 会同步创建新分区,名字形如 SYS_P12345。这过程不可见、不记录在 DDL 脚本里,容易导致两个问题:
- 后续导出表结构时,
DBMS_METADATA.GET_DDL返回的 DDL 里不会包含这些自动生成的分区,直接重建会丢分区 - 分区名无业务含义,做
EXCHANGE PARTITION或手工维护时难定位 - 如果表上有本地索引,新建分区会自动创建对应索引分区,但索引名也由系统生成,监控脚本若依赖固定命名会失效
建议:上线前用 SELECT partition_name FROM user_tab_partitions WHERE table_name = 'T' 拉一次快照,和部署文档一起存档。
为什么不能把 Automatic List Partition 当“免维护”方案
它省的是建分区动作,不是分区管理责任。真实业务中容易踩的坑包括:
- 分区数量失控:没有清理机制,历史废弃值(如已下线的
'ZZ'状态)仍占一个分区,USER_TAB_PARTITIONS行数持续上涨,影响统计信息收集速度 - 查询性能反降:优化器在分区过多时可能放弃分区裁剪,转而走全表扫描,尤其当谓词列上没统计信息时
- 备份恢复变复杂:RMAN 备份本身没问题,但基于时间点恢复后,如果应用层重放了插入语句,可能重复触发自动建分区,造成元数据不一致
真正可控的做法是:用 AUTOMATIC 应对上线初期的不确定性,等业务稳定后,手动把高频值收归到命名清晰的分区,并 ALTER TABLE ... SET AUTOMATIC OFF 关掉自动模式——这个开关 12.2 以后才支持,别在老版本硬试。










