Apache Doris 数据更新操作

作者: 张家锋

1. 介绍

Doris 数据更新目前只在Unique Key 模型上,其他模型不支持数据更新操作,更新操作有两种方式:

  1. REPLACE方式:这种方式和聚合模型中的Replace原理一致,只要表中存在相同key的值,会采用Replace方式替换Value,
  2. UPDATE方式:支持单独修改某一列或者多列,通过Where条件方式 Unique 模型:Doris 系统中的一种数据模型。将列分为两类,Key 和 Value。当用户导入相同 Key 的行时,后者的 Value 会覆盖已有的 Value。与 Mysql 中的 Unique 含义一致

这里主要介绍Update方式使用及要注意的事项,对于正常的插入更新,只需要将数据推介通过Stream Load或者其他load方式,当做正常数据插入就可以了。 Update方式要在0.15.0及以后版本中使用

2. 适应场景

Update 方式适应场景如下:

  • 对满足某些条件的行,修改它的取值。
  • 点更新,小范围更新,待更新的行最好是整个表的非常小一部分。
  • update 命令只能在 Unique 数据模型的表中操作。

2.基本原理及使用方式

2.1 基本原理

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

假设 Doris 中存在一张订单表,其中 订单id 是 Key 列,订单状态,订单金额是 Value 列。数据状态如下:

| 订单id         | 订单金额 | 订单状态 |
| -------------- | -------- | -------- |
| 20210928100001 | 100      | 待付款   |

这时候,用户点击付款后,Doris 系统需要将订单id 为 '20210928100001' 的订单状态变更为 '待发货', 就需要用到 Update 功能。

UPDATE order SET 订单状态='待发货' WHERE 订单id=20210928100001;

用户执行 UPDATE 命令后,系统会进行如下三步:

  • 第一步:读取满足 WHERE 订单id=20210928100001 的行 (20210928100001,100,'待付款')
  • 第二步:变更该行的订单状态,从'待付款'改为'待发货' (20210928100001,100,'待发货')
  • 第三步:将更新后的行再插入回表中,从而达到更新的效果。
| 订单id         | 订单金额 | 订单状态 |
| -------------- | -------- | -------- |
| 20210928100001 | 100      | 待付款   |

由于表 order 是 UNIQUE 模型,所以相同 Key 的行,之后后者才会生效,所以最终效果如下:

| 订单id         | 订单金额 | 订单状态 |
| -------------- | -------- | -------- |
| 20210928100001 | 100      | 待发货   |

2.2 使用方法

2.2.1 语法

UPDATE table_name SET value=xxx WHERE condition;
  • table_name: 待更新的表,必须是 UNIQUE 模型的表才能进行更新。
  • value=xxx: 待更新的列,等式左边必须是表的 value 列。等式右边可以是常量,也可以是某个表中某列的表达式变换。 比如 value = 1, 则待更新的列值会变为1。 比如 value = value +1, 则待更新的列值会自增1。
  • condition:只有满足 condition 的行才会被更新。condition 必须是一个结果为 Boolean 类型的表达式。 比如 k1 = 1, 则只有当 k1 列值为1的行才会被更新。 比如 k1 = k2, 则只有 k1 列值和 k2 列一样的行才会被更新。 不支持不填写condition,也就是不支持全表更新。
  • Update 语法在 Doris 中是一个同步语法,既 Update 语句成功,更新就成功了,数据可见。

3. 数据更新性能

3.1 Update方式

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

  • 待更新的行数:待更新的行数越多,Update 语句的速度就会越慢。这和导入的原理是一致的。 Doris 的更新比较合适偶发更新的场景,比如修改个别行的值。 Doris 并不适合大批量的修改数据。大批量修改会使得 Update 语句运行时间很久。
  • condition 的检索效率:Doris 的 Update 实现原理是先将满足 condition 的行读取处理,所以如果 condition 的检索效率高,则 Update 的速度也会快。 condition 列最好能命中,索引或者分区分桶裁剪。这样 Doris 就不需要扫全表,可以快速定位到需要更新的行。从而提升更新效率。 强烈不推荐 condition 列中包含 UNIQUE 模型的 value 列。

3.2 Replace 方式

这种方式和导入方式基本是一样的,对性能影响不大

4. 并发控制

默认情况下,并不允许同一时间对同一张表并发进行多个 Update 操作。

主要原因是,Doris 目前支持的是行更新,这意味着,即使用户声明的是 SET v2 = 1,实际上,其他所有的 Value 列也会被覆盖一遍(尽管值没有变化)。

这就会存在一个问题,如果同时有两个 Update 操作对同一行进行更新,那么其行为可能是不确定的。也就是可能存在脏数据。

但在实际应用中,如果用户自己可以保证即使并发更新,也不会同时对同一行进行操作的话,就可以手动打开并发限制。通过修改 FE 配置 enable_concurrent_update。当配置值为 true 时,则对更新并发无限制

5. 使用风险

由于 Doris 目前支持的是行更新,并且采用的是读取后再写入的两步操作,则如果 Update 语句和其他导入或 Delete 语句刚好修改的是同一行时,存在不确定的数据结果。

所以用户在使用的时候,一定要注意用户侧自己进行 Update 语句和其他 DML 语句的并发控制。

文章列表

更多推荐

更多
  • Pulsar消息队列-一套高可用实时消息系统实现 实时消息【即时通信】系统,有群聊和单聊两种方式,其形态异于消息队列:1 大量的 group 信息变动,群聊形式的即时通信系统在正常服务形态下,瞬时可能有大量用户登入登出。2 ...
  • Pulsar消息队列-Pulsar对比Kafka笔记 很多人查看 Pulsar 之前可能对 Kafka 很熟悉,参照上图可见二者内部结构的区别,Pulsar 和 Kafka 都是以 Topic 描述一个基本的数据集合,Topic 数据又分为若干 Partition,即对数据进行逻辑上的 ...
  • Pulsar消息队列-对 2017 年一套 IM 系统的反思 信系统的开发,前前后后参与或者主导了六七个 IM 系统的研发。上一次开发的 IM 系统的时间点还是 2018 年,关于该系统的详细描述见 [一套高可用实时消息系统实现][1] ...
  • Apache APISIX文档-快速入门指南-如何构建 Apache APISIX 如何构建 Apache APISIX,步骤1:安装 Apache APISIX,步骤2:安装 etcd,步骤3:管理 Apache APISIX 服务,步骤4:运行测试案例,步骤5:修改 Admin API key,步骤6:为 Apac
  • Apache APISIX文档-快速入门指南-快速入门指南 快速入门指南,概述,前提条件,第一步:安装 Apache APISIX,第二步:创建路由,第三步:验证,进阶操作,工作原理,创建上游服务Upstream,绑定路由与上游服务,添加身份验证,为路由添加前缀,APISIX Dashboard
  • Apache APISIX文档-架构设计-APISIX APISIX,软件架构,插件加载流程,插件内部结构,配置 APISIX,插件加载流程,比如指定 APISIX 默认监听端口为 8000,并且设置 etcd 地址为 http://foo:2379, 其他配置保持默认。在 ...
  • Apache APISIX文档-架构设计-Service Service 是某类 API 的抽象(也可以理解为一组 Route 的抽象)。它通常与上游服务抽象是一一对应的,Route 与 Service 之间,通常是 N:1 的关系,参看下图。不同 Route 规则同时绑定到一个 Service ...
  • Apache APISIX文档-架构设计-Plugin Config 如果你想要复用一组通用的插件配置,你可以把它们提取成一个 Plugin config,并绑定到对应的路由上。举个例子,你可以这么做:创建 Plugin config,如果这个路由已经配置了 plugins,那么 Plugin config ...
  • Apache APISIX文档-架构设计-Debug Mode 注意:在 APISIX 2.10 之前,开启基本调试模式曾经是设置 conf/config.yaml 中的 apisix.enable_debug 为 true。设置 conf/debug.yaml 中的选项,开启高级调试模式。由于 ...
  • Apache APISIX文档-架构设计-Consumer 如上图所示,作为 API 网关,需要知道 API Consumer(消费方)具体是谁,这样就可以对不同 API Consumer 配置不同规则。授权认证:比如有 [key-auth] 等。获取 consumer_...
  • 近期文章

    更多
    文章目录

      推荐作者

      更多