语法

MERGE INTO target
USING source
ON source.a = target.a
WHEN MATCHED THEN
UPDATE SET a = source.a, b = source.b, c = source.c
WHEN NOT MATCHED THEN
INSERT (a, b, c) values (a, b, c)

merge into 实际上是一个语法糖, 相对应的语义也可以通过其他的 sql 语法来表达, 例如 UPDATE/DELETE/INSERT, 但是 merge into 的好处是本身一次事务, 因此可以原子性的完成多个修改的操作.

databricks merge into

Paimon merge into

在 Paimon 中, 主键表和非主键表提供了不同的 merge into 实现方式.

非主键表

COW

处理流程

  1. 通过 join 找出 update/delete 语句所涉及的文件, 及 touched splits. 这一步不需要读取源表的全量字段数据, 只需要读取关联条件所涉及的字段
  2. 将所有涉及到的数据文件作为数据源读取, 并和 source 表进行 full outer join, 对 join 结果进行 match 和 not match 的处理, 并写出至新文件中
  3. 将所有的老的数据文件标记为删除文件, 新写入生成的文件标记为新增文件

为什么需要第一次 inner join?

当 Matched Action 中涉及对原始文件的修改需求, 例如 merge action 中存在 UPDATE 或 DELETE 子句时, 就有两种方式

  • 对 target 表进行一次 insert overwrite, 那么这样对于涉及 update/delete 的文件自然就完成了更新
  • 通过 inner join 找出涉及修改的文件, 再修改完成后通过指定文件 DELETE 的方式标记删除

显然, 在小范围更新的场景下, 第二种方式会更加合适, 可以减少重写文件的数量, 降低存储放大.

为什么需要将 non touched splits 也纳入到计算中?

因为有 WHEN NOT MATCHED 这类 not matched by source/target 时, 就需要将 inner join 未匹配上的数据也参与计算才能使得 WHEN NOT MATCHED 条件判断准确.

劣势:

  1. 原来的一次 join 操作, 被转化为两次 join
  2. 如果 source 是一个包含计算逻辑的 view, 也会被展开执行

优势:

  1. 如果 touched 列表比较小, 可以降低过程中重写的开销以及存储空间

Deletion vector

  1. 直接基于原始的 target, source 进行 full outer join, 同时读取的时候会读取出 target 表中的 row_index, 用于后续的标记删除
  2. 基于 merge action 进行处理
    • 将 INSERT 和 UPDATE_AFTER 数据写入 add 新增文件
    • 将其中的 DELETE 数据标记删除, 构建成 deletion vector 索引文件

优势

  1. 只有一轮 join 和原始计算开销相近
  2. 通过标记删除的方式, 同样可以降低存储空间

主键表

主键表的流程和上面的流程其实很像, 因为本身主键表就有更新删除能力, 因此构建出变更行后直接写回主键表即可.

参考

Paimon merge into 实现原理的更多相关文章

  1. 排序合并连接(sort merge join)的原理

    排序合并连接(sort merge join)的原理 排序合并连接(sort merge join)的原理     排序合并连接(sort merge join)       访问次数:两张表都只会访 ...

  2. Log Structured Merge Trees(LSM) 原理

    http://www.open-open.com/lib/view/open1424916275249.html

  3. 《oracle每天一练》Merge Into 语句代替Insert/Update在Oracle中的应用实战

    转载自窃破天道 动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也 ...

  4. 使用Merge Into 语句实现 Insert/Update

    网址: http://www.eygle.com/digest/2009/01/merge_into_insertupdate.html 动机: 想在Oracle中用一条SQL语句直接进行Insert ...

  5. Oracle中merge into的使用

    http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5 ...

  6. oracle merge用法

    动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...

  7. Oracle中merge into的使用 (转)

    该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1.ins ...

  8. Oracle中merge into的使用 (转)

    http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5 ...

  9. 浅谈SQL Server中的三种物理连接操作(HASH JOIN MERGE JOIN NESTED LOOP)

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

  10. 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

随机推荐

  1. Qt数据库应用10-通用数据库设置

    一.前言 做过了众多的项目,只要是用了数据库的项目,基本上还有一个需求就是,提供一个界面用来初始化数据库,相当于恢复出厂设置的数据,一般恢复出厂设置需要复位的是配置文件.数据库文件.布局文件这几种,其 ...

  2. Qt通用方法及类库1

    函数名 //桌面宽度高度 static int deskWidth(); static int deskHeight(); //程序文件名称+当前所在路径 static QString appName ...

  3. uniapp同城社区交友 仿小红书 APP小程序源码 含后台管理和网页端

    注意(预防被骗) 本程序仅在 破晓店铺(https://shop.abyssdawn.com/).破晓一代网络科技淘宝店 出售其余地方均为骗子. 关于本程序 本程序适用于各种同城社区交友类产品,例如同 ...

  4. ubuntu更换conda的源

    ubuntu更换conda的源有两种方法:一.使用命令行更换Conda源至国内镜像站点.二.直接创建并编辑编辑conda的配置文件.condarc. 一.使用命令行更换Conda源至国内镜像站点 要在 ...

  5. [转]使用Unity进行3D开发的思路和主要技术优势

    此处直接附上别人撰写好的博文,分享给各位读者. 原文链接:Unity3D手游开发实践--<腾讯桌球:客户端总结>.

  6. 即时通讯技术文集(第33期):IM开发综合技术合集(Part6) [共12篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第33 期. [- 1 -] IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计 [链接 ...

  7. react学习之antd

    antd 为 Web 应用提供了丰富的基础 UI 组件,我们还将持续探索企业级应用的最佳 UI 实践.它最初是基于 React 的组件库,但随着技术的发展,现在也提供了基于 Vue.js 的版本--A ...

  8. 搭建gitlab私有仓库

    1.下载gitlab 首先在 /etc/yum.repos.d/目录下配置gitlab下载镜像源. # 进入目录 /etc/yum.repos.d/ cd /etc/yum.repos.d/ # 创建 ...

  9. java线程池优化

    ThreadPoolExecutor机制 一.概述 1.ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程 ...

  10. 在linux系统通过OpenSSL工具自签https证书

    工具介绍 OpenSSL是SSL/TLS协议的实现工具 key是私钥文件,用于对发送给客户端的数据加密,以及对从客户端接收的数据进行解密. csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证 ...