Online DDL及其操作
表对象DDL(数据库表对象的定义或者修改)操作根据其对数据的影响程度,可分为两大类:
即时变更类DDL
定义与特点:
- 仅修改表的元数据,无需进行数据操作。
- 执行速度快,通常在毫秒级完成。
- 执行期间短暂持有排他锁,对并发业务影响小。
并发影响:
- 正常场景:当目标表上无长事务时,对业务影响较小。
- 异常场景:若存在长事务,可能阻塞DDL执行并影响后续业务。
当前支持的即时变更类DDL如表1所示。具体语法请参见ALTER TABLE。
| 分类 | 操作 | 耗时 | 备注 |
|---|---|---|---|
| 列操作 | 支持以下相关操作:
| 当仅修改元数据时,耗时与数据量无关。 |
|
| 表操作 | 支持以下相关操作:
| 当仅修改元数据时,耗时与数据量无关。 | |
| 表空间操作 | 支持以下相关操作:
| 当仅修改元数据时,耗时与数据量无关。 | |
| 约束操作 | 支持以下相关操作:
| 当仅修改元数据时,耗时与数据量无关。 | |
| 分区操作 | 支持以下相关操作:
| 当仅修改元数据时,耗时与数据量无关。 |
数据操作类DDL
定义与特点:
- 需要对实际数据进行重组或者检查操作。
- 执行时间与数据量成正比。
- 传统模式下执行期间表无法提供读写服务,可能导致长时间业务中断。
在线DDL:
定义与特点:
- 通过ONLINE关键字控制,数据操作类DDL通过基础数据重组(检查)和增量数据追增(检查)的方式进行在线变更。
- 不支持rowid表。
并发影响:
- 执行期间大部分时间用户可继续进行数据库的读写操作。
- 仅在前期和后期短暂持有排他锁。
- 显著降低对正常业务的影响。
当前支持的在线DDL的操作类型如表2所示。在线DDL具体参数设置和行为约束请参见ALTER TABLE、VACUUM。
| 分类 | 操作 | 耗时 | 备注 |
|---|---|---|---|
| 列操作 | 支持以下相关操作:
| 需要重整数据,耗时与数据量相关。 |
|
| 表操作 | 支持以下相关操作: 表级在线移动表空间。 | 需要移动数据,耗时与数据量相关。 | |
| 约束操作 | 支持以下相关操作: 添加非空、检查、唯一、主键约束。 | 需要查询数据,耗时与数据量相关。 | |
| 分区操作 | 支持以下相关操作: 切割/合并分区、交换分区、移动分区表空间 | 需要移动数据,耗时与数据量相关。 | |
| 回收存储空间 | VACUUM FULL | 需要重整数据,耗时与数据量相关。 | |
| 索引操作 | 支持创建索引CONCURRENTLY、重建索引CONCURRENTLY、删除索引CONCURRENTLY。 | 需要查询数据,耗时与数据量相关。 | 索引相关操作,请参见CREATE INDEX、REINDEX、DROP INDEX。 |