# Online DDL及其操作
表对象DDL（数据库表对象的定义或者修改）操作根据其对数据的影响程度，可分为两大类：
#### 即时变更类DDL
**定义与特点**：
- 仅修改表的元数据，无需进行数据操作。
- 执行速度快，通常在毫秒级完成。
- 执行期间短暂持有排他锁，对并发业务影响小。
 
**并发影响**：
- 正常场景：当目标表上无长事务时，对业务影响较小。
- 异常场景：若存在长事务，可能阻塞DDL执行并影响后续业务。
当前支持的即时变更类DDL如[表1]所示。具体语法请参见[ALTER TABLE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0211.html)。
 表1当前版本支持的即时变更类DDL介绍 
| 分类    | 操作                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 耗时                    | 备注                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|:---|
| 列操作  | 支持以下相关操作： - 添加列：设置列默认值为表达式。  - 删除列。  - 重命名列。  - 设置和删除列的默认值。  - 扩展varchar大小（仅长度增加时）、  - 修改numeric精度numeric(p,s)（仅p增大，s不变时）。  - 修改ENUM列定义。   | 当仅修改元数据时，耗时与数据量无关。   | - 即时变更类DDL无需结合ONLINE关键字，当为即时变更类DDL添加ONLINE关键字时，ONLINE关键字会忽略。  - 即时变更类DDL执行期间会短暂持有排他锁。在没有并发长事务的场景下，DDL毫秒级完成，对并发事务影响较小。在DDL执行前，如果目标表上有并发长事务，DDL因等待排他锁而被阻塞，进一步会阻塞DDL之后的并发事务。   |
| 表操作     | 支持以下相关操作： - 重命名表。  - 指定字符集。  - 删除表。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 当仅修改元数据时，耗时与数据量无关。 | - 即时变更类DDL无需结合ONLINE关键字，当为即时变更类DDL添加ONLINE关键字时，ONLINE关键字会忽略。  - 即时变更类DDL执行期间会短暂持有排他锁。在没有并发长事务的场景下，DDL毫秒级完成，对并发事务影响较小。在DDL执行前，如果目标表上有并发长事务，DDL因等待排他锁而被阻塞，进一步会阻塞DDL之后的并发事务。   |
| 表空间操作 | 支持以下相关操作： - 重命名表空间。  - 修改表空间所有者。  - 删除表空间。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 当仅修改元数据时，耗时与数据量无关。  | - 即时变更类DDL无需结合ONLINE关键字，当为即时变更类DDL添加ONLINE关键字时，ONLINE关键字会忽略。  - 即时变更类DDL执行期间会短暂持有排他锁。在没有并发长事务的场景下，DDL毫秒级完成，对并发事务影响较小。在DDL执行前，如果目标表上有并发长事务，DDL因等待排他锁而被阻塞，进一步会阻塞DDL之后的并发事务。   |
| 约束操作    | 支持以下相关操作： - 设置列约束为NULL。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 当仅修改元数据时，耗时与数据量无关。    | - 即时变更类DDL无需结合ONLINE关键字，当为即时变更类DDL添加ONLINE关键字时，ONLINE关键字会忽略。  - 即时变更类DDL执行期间会短暂持有排他锁。在没有并发长事务的场景下，DDL毫秒级完成，对并发事务影响较小。在DDL执行前，如果目标表上有并发长事务，DDL因等待排他锁而被阻塞，进一步会阻塞DDL之后的并发事务。   |
| 分区操作    | 支持以下相关操作： - 添加分区、删除分区、截断分区、行迁移开关、设置分区索引不可用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 当仅修改元数据时，耗时与数据量无关。    | - 即时变更类DDL无需结合ONLINE关键字，当为即时变更类DDL添加ONLINE关键字时，ONLINE关键字会忽略。  - 即时变更类DDL执行期间会短暂持有排他锁。在没有并发长事务的场景下，DDL毫秒级完成，对并发事务影响较小。在DDL执行前，如果目标表上有并发长事务，DDL因等待排他锁而被阻塞，进一步会阻塞DDL之后的并发事务。   |
   
#### 数据操作类DDL
**定义与特点**：
- 需要对实际数据进行重组或者检查操作。
- 执行时间与数据量成正比。
- 传统模式下执行期间表无法提供读写服务，可能导致长时间业务中断。
 
#### 在线DDL：
**定义与特点**：
- 通过ONLINE关键字控制，数据操作类DDL通过基础数据重组（检查）和增量数据追增（检查）的方式进行在线变更。
- 不支持rowid表。
 
**并发影响**：
- 执行期间大部分时间用户可继续进行数据库的读写操作。
- 仅在前期和后期短暂持有排他锁。
- 显著降低对正常业务的影响。
当前支持的在线DDL的操作类型如[表2]所示。在线DDL具体参数设置和行为约束请参见[ALTER TABLE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0211.html)、[VACUUM](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0410.html)。
 表2当前版本支持的在线DDL介绍 
| 分类   | 操作                                                                                                                                                                                                                                                                                                                                                                                       | 耗时                  | 备注                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| 列操作 | 支持以下相关操作： - 修改列长度。  - 修改列精度。  - 修改列类型。   | 需要重整数据，耗时与数据量相关。     | - 在线DDL需要结合ONLINE关键字实现。  - 在线DDL在初始化和最后元数据切换的阶段仍然会短暂持有排他锁，可能受目标表上的并发长事务的影响。在线DDL执行前或者元数据切换阶段，如果目标表上有并发长事务，DDL可能因等待排他锁而被阻塞，进一步会阻塞后续并发事务。  - 在线DDL不支持rowid表，详细语法请参见[ALTER TABLE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0211.html)和[VACUUM](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0410.html)。   |
| 表操作  | 支持以下相关操作： 表级在线移动表空间。                                                                                                                                                                                                                                                                                                                         | 需要移动数据，耗时与数据量相关。     | - 在线DDL需要结合ONLINE关键字实现。  - 在线DDL在初始化和最后元数据切换的阶段仍然会短暂持有排他锁，可能受目标表上的并发长事务的影响。在线DDL执行前或者元数据切换阶段，如果目标表上有并发长事务，DDL可能因等待排他锁而被阻塞，进一步会阻塞后续并发事务。  - 在线DDL不支持rowid表，详细语法请参见[ALTER TABLE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0211.html)和[VACUUM](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0410.html)。   |
| 约束操作 | 支持以下相关操作： 添加非空、检查、唯一、主键约束。                                                                                                                                                                                                                                                                                                                | 需要查询数据，耗时与数据量相关。    | - 在线DDL需要结合ONLINE关键字实现。  - 在线DDL在初始化和最后元数据切换的阶段仍然会短暂持有排他锁，可能受目标表上的并发长事务的影响。在线DDL执行前或者元数据切换阶段，如果目标表上有并发长事务，DDL可能因等待排他锁而被阻塞，进一步会阻塞后续并发事务。  - 在线DDL不支持rowid表，详细语法请参见[ALTER TABLE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0211.html)和[VACUUM](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0410.html)。   |
| 分区操作  | 支持以下相关操作： 切割/合并分区、交换分区、移动分区表空间                                                                                                                                                                                                                                                                                                             | 需要移动数据，耗时与数据量相关。 | - 在线DDL需要结合ONLINE关键字实现。  - 在线DDL在初始化和最后元数据切换的阶段仍然会短暂持有排他锁，可能受目标表上的并发长事务的影响。在线DDL执行前或者元数据切换阶段，如果目标表上有并发长事务，DDL可能因等待排他锁而被阻塞，进一步会阻塞后续并发事务。  - 在线DDL不支持rowid表，详细语法请参见[ALTER TABLE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0211.html)和[VACUUM](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0410.html)。   |
| 回收存储空间 | VACUUM FULL                                                                                                                                                                                                                                                                                                                                                                              | 需要重整数据，耗时与数据量相关。   | - 在线DDL需要结合ONLINE关键字实现。  - 在线DDL在初始化和最后元数据切换的阶段仍然会短暂持有排他锁，可能受目标表上的并发长事务的影响。在线DDL执行前或者元数据切换阶段，如果目标表上有并发长事务，DDL可能因等待排他锁而被阻塞，进一步会阻塞后续并发事务。  - 在线DDL不支持rowid表，详细语法请参见[ALTER TABLE](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0211.html)和[VACUUM](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0410.html)。   |
| 索引操作  | 支持创建索引CONCURRENTLY、重建索引CONCURRENTLY、删除索引CONCURRENTLY。                                                                                                                                                                                                                                                                                                                                      | 需要查询数据，耗时与数据量相关。   | 索引相关操作，请参见[CREATE INDEX](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0253.html)、[REINDEX](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0369.html)、[DROP INDEX](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/gaussdb-08-0303.html)。                                                                                                                                                                                                                                                                                                                                                   |
   
