doris:主键模型的 Update 更新

主要讲述如何使用 Update 命令来更新 Doris 中的数据。Update 命令仅适用于 Unique 数据模型的表。

适用场景

  • 小范围数据更新:适用于更新少量数据的场景,例如修复某些记录中的错误字段,或更新某些字段的状态(如订单状态更新等)。

  • ETL 批量加工部分字段:适用于大批量更新某个字段,常见于 ETL 加工场景。注意:大范围数据更新仅适合低频调用。

基本原理

利用查询引擎自身的 where 过滤逻辑,从待更新表中筛选出需要被更新的行。再利用 Unique 模型自带的 Value 列新数据替换旧数据的逻辑,将待更新的行变更后重新插入到表中,从而实现行级别更新。

同步

Update 语法在 Doris 中是一个同步语法,即 Update 语句执行成功,更新操作也就完成了,数据是可见的。

性能

Update 语句的性能和待更新的行数以及条件的检索效率密切相关。

  • 待更新的行数:待更新的行数越多,Update 语句的速度就会越慢。 对于小范围更新,Doris支持的频率与INSERT INTO语句类似, 对于大范围更新,由于单个update执行的时间较长, 仅适用于低频调用。

  • 查询条件的检索效率:Update 实现原理是先将满足查询条件的行做读取处理,所以如果查询条件的检索效率高,则 Update 的速度也会快。条件列最好能命中索引或者分区分桶裁剪,这样 Doris 就不需要扫全表,可以快速定位到需要更新的行,从而提升更新效率。强烈不推荐条件列中包含 value 列。

使用示例

<think>好的,用户想知道如何在Apache Doris中创建唯一键模型表。首先,我需要回顾一下Doris的数据模型Doris主要有三种数据模型:聚合模型(Aggregate)、唯一键模型(Unique)和重复模型(Duplicate)。用户提到的唯一键模型,也就是Unique模型,主要用于需要唯一主键的场景,确保每个主键只存在一行记录。 接下来,我需要回忆创建唯一键模型表的语法。根据引用[4],Unique模型在建表时需要指定唯一键,并且可以通过属性开启Merge-on-write特性。基本语法结构应该是使用CREATE TABLE,指定UNIQUE KEY,然后在PROPERTIES中配置相关参数。例如,DUPLICATE KEY对应的是Duplicate模型,而UNIQUE KEY对应的是Unique模型。 然后,需要确定如何设置Merge-on-write。引用[4]提到,新的Merge-on-write实现默认关闭,需要在建表时通过指定property来启用。因此,在PROPERTIES中应该添加"enable_unique_key_merge_on_write" = "true"。同时,可能还需要注意版本兼容性问题,因为旧版的Merge-on-read无法直接升级到新版,可能需要数据迁移。 另外,用户可能需要了解如何添加Sequence列来处理数据版本。根据引用[4],Sequence列需要在建表时指定function_column.sequence_col参数。所以在建表语句中,需要包含这个参数,例如设置"function_column.sequence_col" = 'update_time',这样Doris会根据这个列的值来保证数据更新的顺序。 还要考虑表的分布方式,比如分区和分桶。Doris通常使用PARTITION BY进行时间范围分区,使用DISTRIBUTED BY HASH进行分桶,这样可以优化查询性能和数据管理。 用户可能还会关心如何查看隐藏列,比如delete_sign。引用[4]提到,可以通过SET show_hidden_columns = true;来显示隐藏列,之后使用DESC table查看。这可能在后续的表维护中用到。 最后,需要提供一个具体的示例,帮助用户理解如何实际应用这些步骤。例如,创建一个包含用户ID、姓名、城市和更新时间字段的表,指定唯一键为用户ID,启用Merge-on-write,并设置更新时间作为Sequence列。同时,添加分区和分桶策略。 可能还需要提醒用户注意事项,比如Merge-on-write只能在建表时开启,旧版升级的问题,以及如何处理数据导入和删除标记。这样用户在使用过程中可以避免常见的问题。</think>### Apache Doris 创建唯一键模型表方法教程 在 Apache Doris 中,**唯一键模型(Unique Key Model)** 用于保证主键唯一性,适用于需要实时更新的场景。以下为创建步骤及技术细节: --- #### **1. 基础语法** 创建唯一键模型表的核心语法为: ```sql CREATE TABLE [IF NOT EXISTS] database_name.table_name ( column_definition1, column_definition2, ... UNIQUE KEY(column_name [, ...]) ) ENGINE=OLAP [PARTITION BY RANGE(...)] [DISTRIBUTED BY HASH(...) BUCKETS ...] PROPERTIES ( "enable_unique_key_merge_on_write" = "true", -- 开启 Merge-on-write 特性 "function_column.sequence_col" = "update_time" -- 指定 Sequence 列(可选) ); ``` - **UNIQUE KEY**:定义唯一键列,支持多列组合[^4]。 - **Merge-on-write**:通过 `enable_unique_key_merge_on_write` 启用,优化写入性能和数据一致性。 --- #### **2. 完整示例** ```sql CREATE TABLE IF NOT EXISTS example_db.user_profile ( user_id BIGINT, name VARCHAR(50), city VARCHAR(20), update_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY(user_id) ) ENGINE=OLAP PARTITION BY RANGE(update_time) () DISTRIBUTED BY HASH(user_id) BUCKETS 8 PROPERTIES ( "replication_num" = "3", "enable_unique_key_merge_on_write" = "true", "function_column.sequence_col" = "update_time" ); ``` - **字段说明**: - `user_id` 作为唯一主键,确保用户唯一性。 - `update_time` 作为 Sequence 列,用于解决数据更新的版本顺序问题。 - **数据分布**: - 按 `update_time` 分区(需补充具体范围)。 - 按 `user_id` 哈希分桶,提升查询效率。 --- #### **3. 高级配置** - **Sequence 列**: 通过 `function_column.sequence_col` 指定时间戳或版本号字段,系统按该列最大值保留最新数据。例如: ```sql "function_column.sequence_col" = "update_time" ``` - **删除标记**: 使用 `DELETE FROM` 语句或设置 `delete_sign` 隐藏列标记删除(需开启 `show_hidden_columns`): ```sql SET show_hidden_columns = true; ``` --- #### **4. 注意事项** 1. **Merge-on-write 特性**: - 需在建表时通过 `enable_unique_key_merge_on_write` 显式开启[^4]。 - 旧版 Merge-on-read 表无法直接升级,需手动迁移数据。 2. **性能优化**: - 合理设计分区分桶策略,避免数据倾斜。 - 高频更新场景建议启用 Merge-on-write 以减少读放大。 --- #### **5. 数据导入示例** ```sql INSERT INTO example_db.user_profile (user_id, name, city) VALUES (1001, '张三', '北京'); ``` 导入时系统会自动处理主键冲突,保留最新版本数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值