不能。Oracle 禁止对已有 LIST 分区表执行 ALTER TABLE ADD PARTITION VALUES (DEFAULT),报 ORA-14323 错误;DEFAULT 分区只能在 CREATE TABLE 时定义,且存在后禁止新增显式值分区,影响查询性能与维护。

列表分区表建好后还能加 DEFAULT 分区吗?
不能。Oracle 明确禁止对已有 LIST 分区表执行 ALTER TABLE ADD PARTITION VALUES (DEFAULT),无论当前是否存在 DEFAULT 分区,都会报 ORA-14323 错误。这不是权限或顺序问题,而是语法硬限制——ADD PARTITION 只接受显式值列表(如 VALUES ('US', 'CA')),不接受 DEFAULT 关键字。
唯一合法方式:建表时一次性声明 DEFAULT 分区
必须在 CREATE TABLE 语句中完整定义,包括 PARTITION BY LIST (col) 和 PARTITION p_default VALUES (DEFAULT) 子句:
CREATE TABLE sales_by_region (
region VARCHAR2(10),
amount NUMBER
) PARTITION BY LIST (region) (
PARTITION p_north VALUES ('NORTH'),
PARTITION p_south VALUES ('SOUTH'),
PARTITION p_default VALUES (DEFAULT)
);
-
PARTITION BY LIST (col)括号不可省,列名必须显式写出,不支持多列省略写法 -
VALUES (DEFAULT)必须作为PARTITION定义的一部分,不能事后追加 - 不能与
AUTOMATIC同时使用;若启用AUTOMATIC,则至少需定义一个非-DEFAULT 初始分区
已有表没 DEFAULT 分区,想补上怎么办?
只能重建表。没有“在线添加”方案,尤其当数据量大、默认分区预期占比高(比如 95%+)时,需谨慎评估停机窗口和迁移成本:
- 导出原表数据(如用
expdp或INSERT /*+ APPEND */ INTO ... SELECT) - 按含
VALUES (DEFAULT)的新 DDL 创建表 - 导入数据,重建索引、约束、授权等
- 重命名切换(
RENAME原表 +RENAME新表),注意应用层连接与依赖
重建后,所有后续 ADD PARTITION 操作都会被阻断——一旦存在 DEFAULT 分区,Oracle 就不允许再新增任何明确值的分区。
DEFAULT 分区存在后查询性能会受影响吗?
会。DEFAULT 分区本质是“兜底容器”,无法利用分区裁剪(partition pruning)优化查询。如果大量查询条件落在未显式分区的值上,就会命中 DEFAULT 分区,导致扫描范围远大于预期。更隐蔽的风险是:它让 DBA 容易忽略分区设计的完整性——比如漏加新业务值(如新增地区代码),结果全进 DEFAULT,久而久之变成“垃圾分区”,数据分布失衡且难以维护。


















