用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。
1、术语
- 基本表(Base Table):创建每个表时,它对应于一个基表。
- Rollup:基于基表或其他上Rollup创建的上Rollup表。
- Index: 物化索引(materialized index)。汇总(Rollup )表或基表都称为物化索引。
- Transaction:每个导入任务都是一个事务,每个事务都有一个惟一的递增事务ID。
2、介绍
Light Schema Change
在介绍之前,有必要了解Apache Doris 1.2.0版本之前的三个Schema Change实现,它们都是异步的:
- 硬链接模式更改(
Hard Linked Schema Change
) 主要对值列进行加减操作,不需要修改数据文件。 - 直接模式更改(
Direct Schema Change
)主要用于更改值列的类型,需要重写数据,但不涉及键列,也不需要重新排序。 - 排序模式更改(
Sort schema change
)主要用于键列模式更改,因为键列加/减/修改类型等操作会影响现有数据的排序,所以需要将数据再次读出,修改,然后排序。
自Apache Doris 1.2.0以来,对于第一种类型,已经引入了轻量级模式更改(light schema change)的新特性。新的轻型模式更改允许在毫秒内完成值列的加减。从Apache Doris 2.0.0开始,默认情况下,所有新创建的表都支持轻模式更改。
除了添加和删除value列之外,其他类型的模式更改的主要原则如下:
执行模式更改的基本过程是从原始表/Index
数据中的数据/Index
生成新的模式表。数据转换主要有两部分,一部分是对已有历史数据的转换,另一部分是对执行模式更改时新导入的数据进行转换。
+----------+
| Load Job |
+----+-----+
|
| Load job generates both origin and new Index data
|
| +------------------+ +---------------+
| | Origin Index | | Origin Index |
+------> New Incoming Data| | History Data |
| +------------------+ +------+--------+
| |
| | Convert history data
| |
| +------------------+ +------v--------+
| | New Index | | New Index |
+------> New Incoming Data| | History Data |
+------------------+ +---------------+
在开始转换历史数据之前,Doris将获取一个最新的事务ID,并等待该事务ID完成之前的所有导入事务。这个事务ID成为一个分水岭。这意味着Doris确保分水岭之后的所有导入任务将同时为原始表/索引和新表/索引生成数据。这样,当历史数据转换完成后,就可以保证新表中的数据是完整的。
创建模式更改的特定语法可以在帮助ALTER TABLE COLUMN的模式更改部分中找到。
3、将位于指定位置的列添加到指定索引
ALTER TABLE table_name ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 对于aggregate 模型,如果添加值列,则指定
agg_type
。 - 对于非聚合模型(例如,
DUPLICATE KEY
),如果添加键列,请指定KEY
关键字。 - 不能在 Rollup Index 中增加 Base Index 中已经存在的列(如有需要,可以重新创建一个 Rollup Index)。
Examples
- 在
example_rollup_index
的col1