为何nested loop要求小表驱动,hash join又为何要求小表hashed?

浑浑噩噩qxQH
2013-10-09 · TA获得超过2579个赞
知道小有建树答主
回答量:929
采纳率:100%
帮助的人:652万
展开全部
nested loop的过程:选择row resource 最小的那个表作为驱动表(外部表),内部表要求有选择性高的index。从外部表(驱动表)里一次取一行对内部表的每行进行比较,即外部表有几个distinct行,就有几次nested loop。所以nested loop的代价是:cost = outer access cost + (inner access cost * outer cardinality)outer access cost应该是读取驱动表到内存,而内部表要求有有效的index也是为了降低inner access cost,而驱动表要求小,也就很好理解了。 Hash join 在缺少index的情况下比nested loop更有效,一般情况下比nested loop更快,因为处理内存中的hash表比b-tree index更迅速。有无index,对hash join并没有什么影响。一般也是选择较小的表(内部表)读入内存,进行hash 算法,根据连接键构建成hash table。该表如果太大的话,会根据当前系统的参数设置,将该表分piece读入内存构建成hash表。然后外部表中的每行也被读入内存进行hash算法,得到一个hash值,对该piece进行比较。所以hash join的cost 如下:cost = (outer access cost * number of hash partitions) + inner access cost 上述两个cost里面都是先计算出读入内存的小表的access cost,只不过小表对于nested loop来说是outer table,而对于hash join而言是inner table 可见,如果一个hash内存设置的大的话,如果只有一个piece,那么cost=内部表与外部表的access cost相加之和,相当的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式