为什么调整join_buffer_size能优化join语句

好多人面对join语句慢的情况下,会调整join_buffer_size,但是为什么调整jbs能提高速度呢,还是借用上一篇中的两个表作为例子
(链接地址:https://blog.csdn.net/weixin_43541262/article/details/106837972)
表1跟表2两个表的数据分别是M,N 。表2用不到索引的情况下

使用Simple Nested-Loop Join算法扫描的行数是100 * 1000=10万行。
使用Block Nested-Loop Join算法扫描的行数是1000+100,由于join buffer是以无序数组的方式组织的,因此对于表2中的每一行,都要做100次的判断,所以总的扫描行数还是100*1000=10万行。
但是后者是在内存中进行操作的,所以速度上会快很多。

假设小表的行数是N,大表的行数是M,那么在BNLJ算法里,两个表都做一次全表扫描,总的行数是M+N,内存中判断的次数是M * N。
这个时候会发现,不管哪种算法,大表或者小表作为驱动表的执行消耗是一样的。但是这是在忽视了join buffer size的情况下。
假如join_buffer放不下表1呢,那就分段放了,执行过程就变成了上一篇文中BNLJ算法的执行流程。
假设驱动表的数据行是N,需要分成K段才能完成整个流程,被驱动表行数是M
所以整个过程中扫描行数是N+x * M * N,其中K=x * N.
内存判断的次数是N * M
所以,这个时候会发现,N + x * M * N中,x才是影响整个扫描行数的关键因素。这个值越小越好。
刚刚我们说了 N 越大,分段数 K 越大。那么,N 固定的时候,什么参数会影响 K 的大小呢?(也就是x的大小)答案是 join_buffer_size。join_buffer_size 越大,一次可以放入的行越多,分成的段数也就越少,对被驱动表的全表扫描次数就越少
所以这也是为什么调整join_buffer_size可以影响join语句的原因。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值