面试题答案
一键面试哈希关联(Hash Join)基本原理
- 构建阶段:
- 数据库会先扫描其中一个较小的表(称为构建表),将其数据逐行读入内存。
- 针对构建表中的每一行数据,根据连接条件中的列值,使用哈希函数计算出一个哈希值。
- 这些数据行根据哈希值被分配到内存中的不同哈希桶(Hash Bucket)中,形成一个哈希表。
- 探测阶段:
- 接着扫描另一个较大的表(称为探测表)。
- 对于探测表中的每一行数据,同样根据连接条件中的列值计算哈希值。
- 依据这个哈希值去查找之前构建好的哈希表中的对应哈希桶。
- 如果在哈希桶中找到了匹配的行(即连接条件满足),就产生连接结果。
哈希关联比嵌套循环关联更具优势的情况
- 大表连接:
- 当两个要连接的表都比较大时,嵌套循环关联由于要对内外表进行多次嵌套扫描,成本很高。而哈希关联先构建较小表的哈希表,探测阶段对大表只扫描一次,整体I/O成本相对较低。
- 内存充足:
- 哈希关联需要将构建表读入内存构建哈希表,所以需要有足够的内存空间。如果内存充足,能够容纳构建表,哈希关联就能高效运行,相比嵌套循环关联有明显优势。
- 连接条件简单:
- 哈希关联适用于连接条件较为简单,便于使用哈希函数计算哈希值的场景。若连接条件复杂,计算哈希值成本高或者无法有效构建哈希表,其优势会减弱。而嵌套循环关联在复杂连接条件下相对更具灵活性,但此时哈希关联在简单条件下的高效性就体现出来了。