更新时间:2026-10-21 GMT+08:00
分享

Online DDL及其操作

表对象DDL(数据库表对象的定义或者修改)操作根据其对数据的影响程度,可分为两大类:

即时变更类DDL

定义与特点:

  • 仅修改表的元数据,无需进行数据操作。
  • 执行速度快,通常在毫秒级完成。
  • 执行期间短暂持有排他锁,对并发业务影响小。

并发影响:

  • 正常场景:当目标表上无长事务时,对业务影响较小。
  • 异常场景:若存在长事务,可能阻塞DDL执行并影响后续业务。

当前支持的即时变更类DDL如表1所示。具体语法请参见ALTER TABLE。

表1 当前版本支持的即时变更类DDL介绍

分类

操作

耗时

备注

列操作

支持以下相关操作:

  • 添加列:设置列默认值为表达式。
  • 删除列。
  • 重命名列。
  • 设置和删除列的默认值。
  • 扩展varchar大小(仅长度增加时)、
  • 修改numeric精度numeric(p,s)(仅p增大,s不变时)。
  • 修改ENUM列定义。

当仅修改元数据时,耗时与数据量无关。

  • 即时变更类DDL无需结合ONLINE关键字,当为即时变更类DDL添加ONLINE关键字时,ONLINE关键字会忽略。
  • 即时变更类DDL执行期间会短暂持有排他锁。在没有并发长事务的场景下,DDL毫秒级完成,对并发事务影响较小。在DDL执行前,如果目标表上有并发长事务,DDL因等待排他锁而被阻塞,进一步会阻塞DDL之后的并发事务。

表操作

支持以下相关操作:

  • 重命名表。
  • 指定字符集。
  • 删除表。

当仅修改元数据时,耗时与数据量无关。

表空间操作

支持以下相关操作:

  • 重命名表空间。
  • 修改表空间所有者。
  • 删除表空间。

当仅修改元数据时,耗时与数据量无关。

约束操作

支持以下相关操作:

  • 设置列约束为NULL。

当仅修改元数据时,耗时与数据量无关。

分区操作

支持以下相关操作:

  • 添加分区、删除分区、截断分区、行迁移开关、设置分区索引不可用。

当仅修改元数据时,耗时与数据量无关。

数据操作类DDL

定义与特点:

  • 需要对实际数据进行重组或者检查操作。
  • 执行时间与数据量成正比。
  • 传统模式下执行期间表无法提供读写服务,可能导致长时间业务中断。

在线DDL:

定义与特点:

  • 通过ONLINE关键字控制,数据操作类DDL通过基础数据重组(检查)和增量数据追增(检查)的方式进行在线变更。
  • 不支持rowid表。

并发影响:

  • 执行期间大部分时间用户可继续进行数据库的读写操作。
  • 仅在前期和后期短暂持有排他锁。
  • 显著降低对正常业务的影响。

当前支持的在线DDL的操作类型如表2所示。在线DDL具体参数设置和行为约束请参见ALTER TABLE、VACUUM。

表2 当前版本支持的在线DDL介绍

分类

操作

耗时

备注

列操作

支持以下相关操作:

  • 修改列长度。
  • 修改列精度。
  • 修改列类型。

需要重整数据,耗时与数据量相关。

  • 在线DDL需要结合ONLINE关键字实现。
  • 在线DDL在初始化和最后元数据切换的阶段仍然会短暂持有排他锁,可能受目标表上的并发长事务的影响。在线DDL执行前或者元数据切换阶段,如果目标表上有并发长事务,DDL可能因等待排他锁而被阻塞,进一步会阻塞后续并发事务。
  • 在线DDL不支持rowid表,详细语法请参见ALTER TABLE和VACUUM。

表操作

支持以下相关操作:

表级在线移动表空间。

需要移动数据,耗时与数据量相关。

约束操作

支持以下相关操作:

添加非空、检查、唯一、主键约束。

需要查询数据,耗时与数据量相关。

分区操作

支持以下相关操作:

切割/合并分区、交换分区、移动分区表空间

需要移动数据,耗时与数据量相关。

回收存储空间

VACUUM FULL

需要重整数据,耗时与数据量相关。

索引操作

支持创建索引CONCURRENTLY、重建索引CONCURRENTLY、删除索引CONCURRENTLY。

需要查询数据,耗时与数据量相关。

索引相关操作,请参见CREATE INDEX、REINDEX、DROP INDEX。

相关文档