乐趣区

关于数据库:SQL-层功能改进-lookupJoin-的优化

一、传统 join 算法
lookupJoin 是 join 查问的一种,传统 join 算法为:

  1. 遍历 A 表,读取一条数据 r
  2. 遍历 B 表,对于每条数据,与 r 进行 join 操作
  3. 反复 1、2 操作,直到 A 表遍历完所有数据

二、lookupJoin 现有的 lookupJoin 流程为:

  1. 遍历 A 表,读取一条数据 r
  2. 通过 join key 以及数据 r 结构 B 表数据取值范畴
  3. 通过结构的取值范畴对 B 表进行读取操作,将读取出的数据与 r 进行 join 操作,返回后果

通过这样的做法,join 可缩小对 B 表全表扫描的操作,晋升执行效率。然而执行 lookupJoin 操作的前提是在 B 表中存在 join key 的索引,否则无奈对 B 表结构取值范畴。

三、分布式 lookupJoin

  1.  分布式 lookupJoin 介绍:
    以往 KaiwuDB 集群在执行 lookupJoin 操作时,会提取 A 数据,依据 A 表数据发送 scan 申请去别的节点读取数据。这样会导致大量后果数据集中在 A 表散布的节点,没有充分利用多节点并行执行的劣势。

当初,咱们将 A 表数据提前通过 hash 重散布路由到多个节点再并行执行 lookupJoin 操作;这样不仅能够进步执行效率,还能够使后果集在多个节点依照 hash key 预散布。

                                         图 1

如图 1 所示,执行 select * from a join b on a.a = b.a 的操作时 B 表中有 join key 的索引 b_a_idx,改良后单节点 lookupJoin 变为三节点执行 lookupJoin 操作,并且使 join 后果集依照 join 列在节点间 hash 散布。2.  分布式 lookupJoin 对分布式执行产生的成果:分布式 lookupJoin 能够使 join 后果集依照 join 列在节点间出现 hash 散布,大大提高了集群节点算力利用率,缩小 hash 重散布的次数,缩短整体 query 执行工夫。

                                         图 2

如图 2 所示,在图 1 的根底上把 join 后果与 C 表再进行 join 查问:select * from a,b,c where a.a=b.a and a.a = c.a,模仿简单查问场景。因为在分布式 lookupJoin 查问后,数据依照 join key 曾经在三节点上 hash 散布了,所以在执行与 C 表的 join 操作时,只须要 hash 重散布 C 表的数据,缩小了 hash 重散布的次数,进步了执行效率。3.  散布表的 lookupJoin:散布表是一种非凡表,表中数据按某列的 hash 值散布在各个节点上,如果散布表的散布列与 hash join 列正好统一,在执行分布式 lookupJoin 时能够间接在各个节点并行执行 lookupJoin,省去了 hash 散布的操作。

 

退出移动版