为何nested loop要求小表驱动,hash join又为何要求小表hashed?(转)
2015-10-14 21:31
351 查看
原文地址:http://blog.csdn.net/rabbitbug/article/details/5049263
一般nested loop适合于返回行数<10000的,较小行数返回的表的连接。
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相加之和,相当的。当然也要算上hash的代价,所以hash应该比nest
loop快,但是选择nested loop还是hash join,一切交给optimizer就可以了。
一般nested loop适合于返回行数<10000的,较小行数返回的表的连接。
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相加之和,相当的。当然也要算上hash的代价,所以hash应该比nest
loop快,但是选择nested loop还是hash join,一切交给optimizer就可以了。
相关文章推荐
- 第 三 十 天:Linux 系 统 优 化 扩 展
- 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-03-优化器
- linux dev 常见特殊设备介绍与应用(loop,null,zero,full,random)
- linux----定义命令别名
- 跟着男票写程序1--opencv遍历图像像素
- CentOS安装swig2.0.9
- opencv第九章-图像局部与分割
- Linux学习 -- 文件系统管理
- centos6.3(64位) 安装apr
- linux 打造man中文手册图解(man-pages-zh帮助页)
- linux命令login
- 为什么新来的技术很难接手维护一个系统
- 下载opencv时出现msvcprtd.lib打不开的错误
- 【转】web服务器apache架构与原理
- Hadoop2.x.x伪分布式环境搭建、测试
- 私有云环境openstack-juno模板共享(用于个人学习)
- linux whatis与whatis database 使用及查询方法(man使用实例)
- eclipse部署上Tomcat后的clean和publish功能
- linux 查看端口是否被占用
- Windows/Linux获取网卡地址方法