论文Cagri Balkesen, Jens Teubner, Gustavo Alonso, M. Tamer Özsu: Main-memory hash joins on multi-core CPUs: Tuning to the underlying hardware. ICDE 2013: 362-373
1. 前言
影响哈希连接算法的因素主要有两点:一是cache命中率,因为CPU在cache中读取数据的速度远高于在内存中读取数据的速度,所以希望在处理数据时可以尽量可以在cache中找到想要的数据,而不希望过多地访问内存;二是多线程带来的同步代价,线程同步需要使用锁机制来保证数据的一致性,而使用锁会带来较大的开销。
当前主流的哈希连接算法主要有两类:一类算法对硬件参数不敏感,即无论在什么硬件环境下,算法的参数都是一样,无需对参数进行调整。这类算法的代表就是在本章另一篇文档Parallel Hash Join #1中提到的不分区的哈希连接算法。这类算法的支持者认为,现代的硬件已经能够很好地隐藏cache丢失带来的影响,而为了减少cache丢失而使用的分区操作会增加线程同步的代价,因此不关心硬件条件的不分区哈希连接算法,比对硬件参数敏感的有分区哈希连接算法更高效。而另一些研究者对此持相反观点,他们认为当前硬件仍然需要仔细考虑cache命中率对算法性能的影响,对硬件参数敏感的有分区哈希连接算法更加高效。
针对以上争议,本文通过实验的方式比较不同条件下各种哈希算法的性能,讨论不关心硬件参数(Hardware-Oblivious)的哈希连接算法,和对硬件参数敏感(Hardware-Conscious)的哈希连接算法的优劣。
2. 哈希连接算法
2.1 Hardware-oblivious hash join
Hardware-oblivious hash join顾名思义就是其不需要根据硬件环境的变化来调整算法参数。在本章另一篇文档Parallel Hash Join #1中提到的no partitioning hash join就属于这一类算法,不分区的哈希连接算法分为两个阶段:build和probe。在build阶段,所有线程同步构建一张哈希表。在probe阶段,所有线程共同工作,在哈希表中找到与S表中元组相匹配的桶。不分区的哈希连接算法如图2.1