NLJ和BNLJ之JOIN底层算法

本文详细介绍了数据库JOIN操作中的Nested Loop Join (NLJ)和Block Nested Loop Join (BNLJ)两种算法。NLJ是通过对外层驱动表逐行与内层被驱动表进行条件匹配来生成结果集。而BNLJ则是NLJ的优化版,通过join buffer预先存储部分外层数据,减少内层循环次数,提高效率。对于小表驱动大表的情况,BNLJ能显著提升性能。
摘要由CSDN通过智能技术生成

Nested Loop Join (NLJ)算法:

NLJ,顾名思义,是指嵌套循环算法,my.oschina.net 上面有一段代码对NLJ做出了说明:

for each row in t1 matching range {                //外层循环
  for each row in t2 matching reference key {      //次内层循环
    for each row in t3 {                           //最内层循环
      if row satisfies join conditions,            //进行条件匹配,若满足,发给client
      send to client
    }
  }
}

即,将驱动表/外部表的结果集作为循环基础数据,然后循环从该结果集每次一条获取数据作为下一个表的过滤条件查询数据,然后合并结果。如果有多表join,则将前面的表的结果集作为循环数据,取到每行再到联接的下一个表中循环匹配,获取结果集返回给客户端。

 

(此处仅对两层循环分析,多层循环可以将最内层循环看作一层,将其余的看作一层进行分析)

我以为,可以将内层表看作被驱动表,外层表看作驱动表。每次join时,从驱动表中先拿出一条数据和被驱动表进行条件匹配,若匹配成功,则将数据连接后放入结果集。接着,外层的驱动表扫描获取第二条记录,并和被驱动表进行条件匹配,将成功的记录连接后放入结果集,剩余数据以此类推。最后,将结果集发给请求的客户端。

并且,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值