@@ -24,7 +24,33 @@ specific language governing permissions and limitations
24
24
under the License.
25
25
-->
26
26
27
- 数据更新,主要指针对相同 Key 的数据 Value 列的值的更新,这个更新对于主键模型来说,就是替换,对于聚合模型来说,就是如何完成针对 value 列上的聚合。
27
+ 数据更新是指对具有相同 key 的数据记录中的 value 列进行修改。对于不同的数据模型,数据更新的处理方式有所不同:
28
+
29
+ - ** 主键(Unique)模型** :主键模型是专门为数据更新设计的一种数据模型。Doris 支持两种存储方式:Merge-on-Read(MoR)和 Merge-on-Write(MoW)。MoR 优化了写入性能,而 MoW 则提供了更好的分析性能。从 Doris 2.1 版本开始,默认存储方式为 MoW。主键模型支持使用 ` UPDATE ` 语句进行少量数据更新,也支持通过导入方式进行批量更新。导入方式包括 Stream Load、Broker Load、Routine Load 和 Insert Into 等,所有导入操作都遵循“UPSERT”语义,即如果记录不存在则插入,存在则更新。更新操作支持整行更新和部分列更新,默认为整行更新。
30
+
31
+ - ** 聚合(Aggregate)模型** :在聚合模型中,数据更新是一种特殊用法。当聚合函数设置为 REPLACE 或 REPLACE_IF_NOT_NULL 时,可以实现数据更新。聚合模型仅支持基于导入方式的更新,不支持使用 ` UPDATE ` 语句。通过设置聚合函数为 REPLACE_IF_NOT_NULL,可以实现部分列更新的能力。
32
+
33
+ 通过对不同模型的数据更新方式的理解,可以更好地选择适合的更新策略,以满足具体的业务需求。
34
+
35
+ ## 不同模型/实现的更新能力对比
36
+
37
+ ### 性能对比
38
+ | | Unique Key MoW | Unique Key MoR | Aggregate Key |
39
+ | ----------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------------|
40
+ | 导入速度 | 导入过程中进行数据去重,小批量实时写入相比 MoR 约有 10%-20% 的性能损失,大批量导入(例如千万级/亿级数据)相比 MoR 约有 30%-50% 的性能损失 | 与 Duplicate Key 接近 | 与 Duplicate Key 接近 |
41
+ | 查询速度 | 与 Duplicate Key 接近 | 需要在查询期间进行去重,查询耗时约为 MoW 的 3-10 倍 | 如果聚合函数为 REPLACE/REPLACE_IF_NOT_NULL,查询速度与 MoR 接近 |
42
+ | 谓词下推 | 支持 | 不支持 | 不支持 |
43
+ | 资源消耗 | - ** 导入资源消耗** :相比 Duplicate Key/Unique Key MoR,约额外消耗 10%-30% 的 CPU。<br /> - ** 查询资源消耗** :与 Duplicate Key 接近,无额外资源消耗。<br /> - ** Compaction 资源消耗** :相比 Duplicate Key,消耗更多内存和 CPU,具体取决于数据特征和数据量。 | - ** 导入资源消耗** :与 Duplicate Key 相近,无额外资源消耗。<br /> - ** 查询资源消耗** :相比 Duplicate Key/Unique Key MoW,查询时额外消耗更多的 CPU 和内存。<br /> - ** Compaction 资源消耗** :相比 Duplicate Key,需更多内存和 CPU,具体数值取决于数据特征和数据量。 | 与 Unique Key MoR 相同 |
44
+
45
+ ### 功能支持对比
46
+ | | Unique Key MoW | Unique Key MoR | Aggregate Key |
47
+ | ----------------| ----------------| ----------------| ----------------|
48
+ | UPDATE | 支持 | 支持 | 不支持 |
49
+ | DELETE | 支持 | 支持 | 不支持 |
50
+ | sequence 列 | 支持 | 支持 | 不支持 |
51
+ | delete_sign | 支持 | 支持 | 不支持 |
52
+ | 部分列更新 | 支持 | 不支持 | 支持(但无法更新 null 值) |
53
+ | 倒排索引 | 支持 | 不支持 | 不支持 |
28
54
29
55
## 主键(Unique)模型的更新
30
56
@@ -35,14 +61,14 @@ Doris 主键 (unique) 模型,从 Doris 2.0 开始,除了原来的 Merge-on-R
35
61
``` sql
36
62
CREATE TABLE IF NOT EXISTS example_tbl_unique_merge_on_write
37
63
(
38
- ` user_id` LARGEINT NOT NULL ,
39
- ` username` VARCHAR (50 ) NOT NULL ,
40
- ` city` VARCHAR (20 ),
41
- ` age` SMALLINT ,
42
- ` sex` TINYINT,
43
- ` phone` LARGEINT,
44
- ` address` VARCHAR (500 ),
45
- ` register_time` DATETIME
64
+ ` user_id` LARGEINT NOT NULL ,
65
+ ` username` VARCHAR (50 ) NOT NULL ,
66
+ ` city` VARCHAR (20 ),
67
+ ` age` SMALLINT ,
68
+ ` sex` TINYINT,
69
+ ` phone` LARGEINT,
70
+ ` address` VARCHAR (500 ),
71
+ ` register_time` DATETIME
46
72
)
47
73
UNIQUE KEY(` user_id` , ` username` )
48
74
DISTRIBUTED BY HASH(` user_id` ) BUCKETS 1
@@ -58,9 +84,9 @@ PROPERTIES (
58
84
59
85
### 主键模型的两种更新方式
60
86
61
- #### 使用` UPDATE ` 语句更新
87
+ #### 使用 ` UPDATE ` 语句更新
62
88
63
- 无论是 MoR 还是 MoW,语义都是完成对指定列的更新。单次UPDATE的耗时会随着被更新的数据量的增加而增长 。
89
+ 无论是 MoR 还是 MoW,语义都是完成对指定列的更新。单次 UPDATE 的耗时会随着被更新的数据量的增加而增长 。
64
90
65
91
#### 基于导入的批量更新
66
92
@@ -72,13 +98,13 @@ Doris 支持多种数据导入方式,包括 Stream Load、Broker Load、Routin
72
98
73
99
我们会分别在文档 [ 主键模型的 Update 更新] ( ../update/unique-update ) 和 [ 主键模型的导入更新] ( ../update/update-of-unique-model ) 详细介绍两种更新方式。
74
100
75
- ### 主键模型的更新事务
101
+ ### 主键模型的更新并发控制
76
102
77
- #### 使用` UPDATE ` 语句更新数据
103
+ #### 使用 ` UPDATE ` 语句更新数据
78
104
79
- 默认情况下,Doris 不允许在同一时间对同一张表进行多个` UPDATE ` 操作。` UPDATE ` 语句通过表级锁来确保事务的一致性 。
105
+ 默认情况下,Doris 不允许在同一时间对同一张表进行多个 ` UPDATE ` 操作。` UPDATE ` 语句通过表级锁来确保隔离性 。
80
106
81
- 用户可以通过修改 FE 配置` enable_concurrent_update=true ` 来调整并发限制。当放宽并发限制时,` UPDATE ` 语句将不再提供事务保证 。
107
+ 用户可以通过修改 FE 配置 ` enable_concurrent_update=true ` 来调整并发限制。当放宽并发限制时,多个 ` UPDATE ` 语句如果更新同一行数据,结果将是未定义的 。
82
108
83
109
#### 基于导入的批量更新
84
110
@@ -88,32 +114,18 @@ Doris 对所有导入更新操作提供原子性保障,即每次导入数据
88
114
89
115
由于多个并发导入更新的提交顺序可能无法预期,若这些并发导入涉及相同主键的更新,则其生效顺序也无法预知,最终的可见结果会因此存在不确定性。为解决此问题,Doris 提供了 sequence 列机制,允许用户在并发导入更新时为每一行数据指定版本,以便明确控制并发更新的结果顺序,实现确定性。
90
116
91
- 我们将在文档[ 主键模型的更新事务] ( ../update/unique-update-transaction.md ) 中对事务机制进行详细介绍
117
+ 我们将在文档 [ 主键模型的更新事务] ( ../update/unique-update-transaction.md ) 中对事务机制进行详细介绍。
92
118
93
119
## 聚合(Aggregate)模型的更新
94
120
95
- 聚合模型的更新,主要是指的是用新的列值和旧的聚合值按照聚合函数的要求产出新的聚合值 。
121
+ 聚合模型的更新,主要是指用新的列值和旧的聚合值按照聚合函数的要求产出新的聚合值 。
96
122
97
123
New Agg Value = Agg Func ( Old Agg Value, New Column Value)
98
124
99
- 聚合模型只支持基于导入方式的更新,不支持使用 Update 语句更新。在定义聚合模型表的时候,如果把 value 列的聚合函数定义为 REPLACE_IF_NULL,也可以间接实现类似主键表的部分列更新能力。更多内容,请查看 [ 聚合模型的导入更新] ( ../update/update-of-aggregate-model ) 。
100
-
101
- ## 不同模型/实现的更新能力对比
102
-
103
- ### 性能对比
104
- | | Unique Key MoW | Unique Key MoR | Aggregate Key |
105
- | ----------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------------|
106
- | 导入速度 | 导入过程中进行数据去重,小批量实时写入相比MoR约有10%-20%的性能损失,大批量导入(例如千万级/亿级数据)相比MoR约有30%-50%的性能损失 | 与Duplicate Key接近 | 与Duplicate Key接近 |
107
- | 查询速度 | 与Duplicate Key接近 | 需要在查询期间进行去重,查询耗时约为 MoW 的3-10倍 | 如果聚合函数为REPLACE/REPLACE_IF_NOT_NULL,查询速度与MoR接近 |
108
- | 谓词下推 | 支持 | 不支持 | 不支持 |
109
- | 资源消耗 | - ** 导入资源消耗** :相比Duplicate Key/Unique Key MoR,约额外消耗约10%-30%的CPU。<br /> - ** 查询资源消耗** :与Duplicate Key接近,无额外资源消耗。<br /> - ** Compaction资源消耗** :相比Duplicate Key,消耗更多内存和CPU,具体取决于数据特征和数据量。 | - ** 导入资源消耗** :与Duplicate Key相近,无额外资源消耗。<br /> - ** 查询资源消耗** :相比Duplicate Key/Unique Key MoW,查询时额外消耗更多的CPU和内存。<br /> - ** Compaction资源消耗** :相比Duplicate Key,需更多内存和CPU,具体数值取决于数据特征和数据量。 | 与Unique Key MoR相同 |
125
+ 聚合模型只支持基于导入方式的更新,不支持使用 Update 语句更新。在定义聚合模型表的时候,如果把 value 列的聚合函数定义为 REPLACE_IF_NOT_NULL,也可以间接实现类似主键表的部分列更新能力。更多内容,请查看 [ 聚合模型的导入更新] ( ../update/update-of-aggregate-model ) 。
110
126
111
- ### 功能支持对比
112
- | | Unique Key MoW | Unique Key MoR | Aggregate Key |
113
- | ----------------| ----------------| ----------------| ----------------|
114
- | UPDATE | 支持| 支持| 不支持 |
115
- | DELETE | 支持| 支持| 不支持 |
116
- | sequence列 | 支持| 支持| 不支持 |
117
- | delete_sign | 支持| 支持| 不支持 |
118
- | 部分列更新 | 支持| 不支持| 支持(但无法更新null值) |
119
- | 倒排索引 | 支持| 不支持| 不支持 |
127
+ ## 主键模型和聚合模型的选择建议
128
+ - 大部分有数据更新需求的场景,都建议** 首选主键模型** 。例如从 TP 数据库 CDC 同步到 Doris,用户画像,人群圈选等。
129
+ - 下面两类场景,建议使用聚合模型:
130
+ 1 . 部分字段需要做指标聚合,部分字段需要进行更新。
131
+ 2 . 对部分列更新有需求,同时对写入性能非常敏感,对查询延迟要求不高的场景,建议使用聚合表 + REPLACE_IF_NOT_NULL 聚合函数。
0 commit comments