【连载】关系型数据库是如何工作的?(15) - 查询管理器之Hash Join
2016-05-14 15:24
337 查看
Hash连接在很多情况下都比嵌套循环连接有低的成本。
其主要思路是:
1) 拿到内关系中的所有元素;
2) 利用一个Hash函数构建一个内存Hash表;
3) 从外关系中一个一个的取出元素;
4) 利用Hash函数计算每个元素的Hash值,找到Hash表中关联的桶;
5) 如果桶中有元素和当前外层关系元素相等,则匹配成功。
为了简化计算时间复杂度,需要做一些假定:
内关系被划分为X个桶;
利用Hash函数划分内关系和外关系时,桶的数量相等;
匹配一个外关系元素和桶内所有内关系元素的花费是桶内元素的数量。
基于以上假设,时间复杂度是 (M/X) * N + cost_to_create_hash_table(M) + cost_of_hash_function*N,如果Hash函数创建了足够小尺寸的桶,那么时间复杂度是O(M+N)。
这种算法也有一个变种:
1) 计算内关系和外关系的Hash表;
2) 将两个Hash表放入磁盘;
3) 然后依次比较Hash值相同的两个桶(两个桶都先加载到内存)。
译者注:这种算法也可以应用在内存有限时比较两组海量字符串时。
其主要思路是:
1) 拿到内关系中的所有元素;
2) 利用一个Hash函数构建一个内存Hash表;
3) 从外关系中一个一个的取出元素;
4) 利用Hash函数计算每个元素的Hash值,找到Hash表中关联的桶;
5) 如果桶中有元素和当前外层关系元素相等,则匹配成功。
为了简化计算时间复杂度,需要做一些假定:
内关系被划分为X个桶;
利用Hash函数划分内关系和外关系时,桶的数量相等;
匹配一个外关系元素和桶内所有内关系元素的花费是桶内元素的数量。
基于以上假设,时间复杂度是 (M/X) * N + cost_to_create_hash_table(M) + cost_of_hash_function*N,如果Hash函数创建了足够小尺寸的桶,那么时间复杂度是O(M+N)。
这种算法也有一个变种:
1) 计算内关系和外关系的Hash表;
2) 将两个Hash表放入磁盘;
3) 然后依次比较Hash值相同的两个桶(两个桶都先加载到内存)。
译者注:这种算法也可以应用在内存有限时比较两组海量字符串时。
相关文章推荐
- c语言实现hashmap(转载)
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- Ruby中Hash的11个问题解答
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- Ruby简明教程之数组和Hash介绍
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- 在C#中生成与PHP一样的MD5 Hash Code的方法
- js中hash和ico的关联分析
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- Javascript SHA-1:Secure Hash Algorithm