IEJoin: 提高 Databend range join 性能

news2024/12/27 11:34:46

作者:王旭东

Databend 研发工程师

xudong963 (xudong.w) · GitHub

IEJoin 算法可以高效的处理时序场景中的 Range(ASOF) Join。

Join conditions

Equi condition

在 下面 SQL 中

SELECT *
FROM employee JOIN department
ON employee.DepartmentID = department.DepartmentID AND 
employee.ID = department.ID;

employee.DepartmentID = department.DepartmentID OR employee.ID = department.ID 都是 equi-condition,它们用 AND 连接,这条 SQL 被称为 equi-join。

Non-equi condition

condition 可以是任意的 bool 表达式,不局限于 = 和 AND。这类 condition 被称为 non-equi condition, 进一步可以细分为 Range condition 和 Other condition。

  • Range condition

    • 范围比较,如 employee.DepartmentID > department.DepartmentID 就是 range condition, 这类 condition 在时序场景中非常常见。
  • Other condition

    • 除了 Range condition 的其他各种奇奇怪怪的 contition, 可以被归为 Other condition, 如 OR 连接的 condition, employee.DepartmentID = department.DepartmentID OR employee.ID = department.ID

Join condition → Join algorithm

在 Databend 中,我们根据 join condition 的类别选择不同的 join 算法,使 join 能够最高效。

如果包含 equi condition,选择 hash join (即使还包含其他类型的 condition ),hash join 可以高效的利用 equi condition 过滤到一定数量的数据,剩下的数据再利用其他 condition 过滤。

如果至少两个 IE condition,选择 IEJoin,一般数据库会使用 Nested Loop Joins,非常的低效。

如果只有一个 IE condition,选择 merge join。

什么是 IEJoin,它有什么黑魔法?

IEJoin

将 join keys 涉及到的 columns 放到 sorted arrays 中,利用 permutation array 来记录一个 sorted array 中 tuples 相对于另一个 sorted array 的位置,通过 bit array 来高效的计算符合两个 IE conditions 的 tuples 的交集。

IEJoin 在整体 pipeline 架构上的设计

IEJoin 算法

mysql> select * from east;
+------+------+------+-------+
| id   | dur  | rev  | cores |
+------+------+------+-------+
|  101 |  100 |   12 |     8 |
|  102 |   90 |    5 |     4 |
|  100 |  140 |   12 |     2 |
+------+------+------+-------+

mysql> select * from west;
+------+------+------+-------+
| t_id | time | cost | cores |
+------+------+------+-------+
|  404 |  100 |    6 |     4 |
|  498 |  140 |   11 |     2 |
|  676 |   80 |   10 |     1 |
|  742 |   90 |    5 |     4 |
+------+------+------+-------+
SELECT east.id, west.id
FROM east, west
WHERE east.dur < west.time AND east.rev > west.cost

这条 SQL 在大多数数据库中都会被按照 Cross join 处理(如果数据规模很大,甚至会直接 OOM ),但是如果用 IEjoin 算法来处理,速度会得到数量级的提升 🚀

为了便于理解,首先看一条 SelfJoin 的例子

SELECT s1.t_id, s2.t_id
FROM west s1, west s2
WHERE s1.time > s2.time AND s1.cost < s2.cost

对 time 列递增排序,得到 L1

 对 cost 列递增排序,得到 L2

通过 L1 和 L2 可以得到 permutation array(P),P 记录了 L2 中 tuple id 在 L1 中位置

如:T4 在 L2 中的位置是1,对应到 L1 是2,所以 P 的第一个元素是 2。

初始化 bit-array,bit-array 是基于 L1 的,初始时全部为 0。

对于 L2,后 visit 的 cost 大于先 visit 的 cost,即满足 s1.cost < s2.cost,如先访问 T4,则 bit-array 的第二个元素被设置为 1,再访问 T3 的时候,对应 bit-array 中第一个元素,它后面的第二个元素已经被设置为 1,说明 T4.cost < T3.cost,则 {T4, T3} 符合条件 s1.cost < s2.cost

对于 L1,由于 bit-array 是基于 L1 的,所以如果 bit-array 中某个位置之后的位置被设置为 1,则表明后面设为 1 的位置的 tuple id 满足 s1.time > s2.time, 如 T1 对应的位置设为 1,当访问 T3 时,T1.time > T3.time,则 {T1, T3} 符合条件 s1.time > s2.time

bit-array 的作用就是通过标记,来找到同时满足两个 IE conditions 的 tuple pair。

算法流程

  • 遍历 P, P[1] 对应 T4,T4 在 L1 中的位置是 P[1] = 2,将 bit-array 的第二个位置设为 1,由于其后位置都为 0,所以没有满足条件的结果。

  • P[2] 对应 T1,T1 在 L1 中的位置是 P[1] = 3,将 bit-array 的第三个位置设为 1,由于其后位置都为 0,所以没有满足条件的结果。

  • P[3] 对应 T3,T3 在 L1 中的位置是 P[3] = 1,将 bit-array 的第一个位置设为1,由于 bit-array 的第二/三位置都为 1,所以 {T1, T3}, {T4, T3} 满足条件。

  • P[4] 对应 T2,T2 在 L1 中的位置是 P[4] = 4,将 bit-array 的第四个位置设为 1,由于它是最后一个位置,所以没有满足条件的结果。

由 SelfJoin 拓展到不同表 join

SELECT east.id, west.id
FROM east, west
WHERE east.dur < west.time AND east.rev > west.cost

对 dur 排序得到 L1,对 rev 排序得到 L2。 L2 和 L1 比较得到 P。

对 time 排序得到 L1’,对 cost 排序得到 L2’。 L2’ 和 L1’ 比较得到 P’。

将 L1 和 L1’ 合并排序,L2 和 L2’ 合并排序,合并 P 和 P’。

最终得到了合 SelfJoin 类似的数据结构,可以应用 SelfJoin 的算法流程,但是需要处理掉重复的结果。

性能数据

M1 mac (10 core, 32G)

SQL: select count() from lineitem join orders on l_orderkey > o_orderkey and l_partkey < o_custkey;

TPCH SF 0.01

IEJoin: 0.974s, Cross join: 16.639s

TPCH SF 0.1

IEJoin: 79.085s, Cross join: OOM

Connect With Us

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

  • Databend Website
  • GitHub Discussions
  • Twitter
  • Slack Channel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1084984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring 方法升级 在hellospring接口里面

1.现在实现类Hellojava写一个构造方法 2.去配置文件那里 3.测试 就留下第一步 看下面测试情况 我们在这里并没有去getbean它 但是我们new了 那就说明 只要我们newl它该对象就已经创建好了

如何把电脑上的游戏串流助手设置为开机自启动?

注意&#xff1a;想要直接将 游戏串流助手 扔进“启动”文件夹里面&#xff0c;是没有用的&#xff0c;重启电脑根本打不开游戏串流助手&#xff01; 步骤一&#xff1a;每次双击 游戏串流助手之后&#xff0c;都会弹出这个用户账户控制&#xff0c;我们第一步就是要把这个禁用…

uniapp小程序实现绘制内容,生成海报并保存截图(Painter和Canvas两种方式举例)

一、Painter方法 Painter插件传送门 1.下载资源包 2.将资源包的如下部分 3.使用页面引入组件 ui样式 <paintercustomStyle=margin-left: 40rpx; height: 1000rpx;palette="{{palette}}"bind:imgOK="onImgOK"/>data 中数据(绘制内容,替换区域) pai…

深圳想要开低佣金开户?怎么开股票账户佣金最低?

深圳想要开低佣金开户&#xff1f;怎么开股票账户佣金最低&#xff1f; 炒股开户的方法一般有两种&#xff1a; 在线开户&#xff1a;通过证券公司的官网或手机APP进行在线开户。具体流程一般为填写个人信息、进行身份认证、签署相关协议并上传相关材料&#xff0c;最后等待审…

【C语言】文件的操作与文件函数的使用(详细讲解)

前言&#xff1a;我们在学习C语言的时候会发现在编写一个程序的时候&#xff0c;数据是存在内存当中的&#xff0c;而当我们退出这个程序的时候会发现这个数据不复存在了&#xff0c;因此我们可以通过文件把数据记录下来&#xff0c;使用文件我们可以将数据直接存放在电脑的硬盘…

Pytorch深度学习—FashionMNIST数据集训练

文章目录 FashionMNIST数据集需求库导入、数据迭代器生成设备选择样例图片展示日志写入评估—计数器模型构建训练函数整体代码训练过程日志 FashionMNIST数据集 FashionMNIST&#xff08;时尚 MNIST&#xff09;是一个用于图像分类的数据集&#xff0c;旨在替代传统的手写数字…

各种小程序/PC/移动端修改代码/文件后, 不热重载问题修复

各种框架有各种的配置,首先检查是否配置了热更新, 打个比方,taro中底版本中配置热更新是在配置文件中开启mini.hot,高版本中,终端执行打包命令的时候,添加–watch参数, 如果以上检查都没有问题,依旧还是没有热更新,那么很有可能是依赖出了问题,可以通过以下方法,重新…

Spring 趣玩

1、修改控制台启动显示的图案 在SpringBoot项目的resources目录下新建一个banner.txt文本文件&#xff0c;然后将启动Banner粘贴到此文本文件中&#xff0c;启动项目即可。 在线制作banner ①、http://patorjk.com/software/taag/ ②、https://www.bootschool.net/ascii ③、ht…

mysql数据库创建及用户添加和权限管理

1、创建数据库&#xff1a; CREATE DATABASE database_name; 例如&#xff1a; CREATE DATABASE mydatabase; 2、创建用户&#xff1a; CREATE USER usernamehostname; 例如&#xff1a; CREATE USER myuserlocalhost; 注意&#xff1a;替换 username 为你想要创建的用户名&a…

香港云服务器使用的小误区

​  当前&#xff0c;在海外市场的发展下&#xff0c;香港云服务器被推的火热。一方面&#xff0c;您可以根据需要积极利用它的免备案和国际线路等特性&#xff0c;另一方面&#xff0c;也可以借助它&#xff0c;使用尽可能多或尽可能少的存储空间&#xff0c;您的业务也可以…

高校教务系统登录页面JS分析——合肥工业大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

干货分享|超全项目管理流程PPT汇总

我是胖圆&#xff0c;欢迎大家关注留言~ 或者移步公众号【胖圆说PM】找我~

linux放开8080端口

linux放开8080端口 输入命令&#xff1a; 查看8080端口是否开放 firewall-cmd --query-port8080/tcpno显示端口未打开&#xff0c;yes表示开启&#xff0c;linux开启防火墙默认关闭8080端口 这里是引用&#xff1a;https://blog.csdn.net/weixin_54067866/article/details/1…

虹科AR VIP研讨会 | 数字世界,视觉无界,诚邀您前来体验!

文章来源&#xff1a;虹科数字化AR 点击阅读原文&#xff1a;https://mp.weixin.qq.com/s/Q1YbpD0Mxq-KctOMALM0AA 点击链接报名&#xff1a;https://mp.weixin.qq.com/s/Q1YbpD0Mxq-KctOMALM0AA 主题速览 01 医疗保健的未来趋势&#xff1a;透过智能眼镜成像技术改善微创手术…

WorkPlus AI智能助理,基于GPT为企业提供专属的私有化部署解决方案

在当今数字时代&#xff0c;优质的客户服务是企业取得成功的重要因素之一。随着人工智能技术的不断发展&#xff0c;私有化部署AI智能客服成为企业提高客户体验、提升服务效率的新途径。WorkPlus作为领先的品牌&#xff0c;专注于提供可信赖的私有化部署解决方案&#xff0c;助…

物联网23届毕业了不想干Java转嵌入式可行吗?

物联网23届毕业了不想干Java转嵌入式可行吗? 可以的&#xff0c;现在嵌入式物联网的就业前景是比较不错的&#xff0c;物联网和嵌入式是相结合的&#xff0c;题主是电子信息工程专业的&#xff0c;小谷建议你学习嵌入式物联网&#xff0c;其覆盖的范围还是比较广的&#xff0c…

day04_方法_数组

今日内容 方法数组基础 复习 0 if(){ }else{ } if(){ }else if(){ }else if(){ }else{ } 1 循环的四要素 初始值,控制条件,迭代,循环体 2 迭代什么意思 迭代: 一次次的变化 3 for循环执行流程 (小红旗) for(int i 1;i < 11;i){ } 4 break,continue,return分别什么作用 brea…

正规的股票杠杆公司排名:安全的五大加杠杆的股票平台排行一览

在股票市场中&#xff0c;利用杠杆效应可以放大投资者的收益。然而&#xff0c;选择一个正规、可靠的杠杆公司至关重要。本篇文章将根据配查信、尚红网、倍悦网、兴盛网、诚利和、嘉正网、广瑞网、富灯网、天创网、恒正网、创通网等媒体提供的信息&#xff0c;分析并整理出正规…

我们用i.MX8M Plus开发了一个人工智能机器人小车,欢迎围观~

i.MX8M Plus的人工智能机器小车功能 AGV 小车是基于 i.MX8M Plus 为主控实现的一款双驱差速小车。从上到下由摄像头、舵机控制板、舵机、i.MX8M Plus 核心板与底板、电池、电机、轮子等组成。 i.MX8M Plus 有以下 5 个职责&#xff1a; 控制小车电机&#xff0c;负责控制小车…

智能洗衣管理系统中的RFID技术应用

一、行业背景 当前&#xff0c;酒店、医院、浴场以及专业洗涤公司面临着大量工作服和布草的交接、洗涤、熨烫、整理和储存等工序&#xff0c;如何有效地跟踪管理每一件布草的洗涤过程、洗涤次数、库存状态和布草归类等成为了一个巨大的挑战&#xff1a; 1、传统的纸面洗涤任务…