知识卡片

连接运算三大类算法的适用条件

结构图卡

内容

两张表做连接运算,三大类算法解决的是不同前提条件下”怎么避免真的 做完整笛卡儿积再筛选”这个问题。嵌套循环连接是最基础的做法:外层 循环遍历表r的每条记录,内层循环遍历表s的每条记录,逐对比较是否 满足连接条件——不需要任何前提(不要求排序、不要求索引),因此 最通用,但代价随两表元组数的乘积增长,效率最低;它有两个改进版本: 若表s在连接属性上已有索引,改用索引嵌套循环连接,内层不用扫全表 而是直接查索引;若按数据块而非单条记录做嵌套(块嵌套循环),能减少 磁盘块的重复读取次数。哈希连接适合等值连接和自然连接:用哈希函数 把两表的记录按连接属性分到多个桶里,只需要比较落在同一个哈希桶 里的记录对,天然避免了大量不必要的比较,选较小的表建哈希表效率 更高;当内存不足以一次装下整个哈希表时,还有磁盘哈希连接、Grace Hash Join等变种把数据分块处理。归并连接要求两张表都已经按连接 关键字有序排列(若本来无序,先排序再归并,即排序归并连接;若已建 索引,可以借索引间接获得有序访问,即索引归并连接),归并连接对 每张表只需要读一次,是三类里综合效率通常最高的,但前提”两表都 有序”往往需要额外付出排序或建索引的代价才能满足。三类算法的选型 本质是:完全没有额外结构可用时退而求其次用嵌套循环,有索引优先 利用索引,数据能排好序时归并连接通常最优。

结构图

flowchart TD
    A[连接运算实现] --> B[嵌套循环连接<br/>无前提, 效率最低]
    A --> C[哈希连接<br/>适合等值/自然连接, 用哈希桶避免全量比较]
    A --> D[归并连接<br/>要求两表按连接键有序, 每表仅读一次]
    B --> B1[索引嵌套循环: 内层用索引替代全表扫描]
    B --> B2[块嵌套循环: 按块而非记录嵌套, 减少I-O]
    D --> D1[排序归并连接: 先排序再归并]
    D --> D2[索引归并连接: 借索引获得有序访问]

参考来源

- 位置:《数据库原理(微课版)》第10章《查询处理与优化》10.2.2节"连接 运算"(源文件:_epub-src/index_split_006.html) - 结论依据:原文明确"嵌套循环连接算法……仅需要对两张表进行全表扫描 ……此算法的缺点是效率低;优点是实现简单,不需要对参与连接运算的 两张表创建索引或排序""哈希连接……适用于等值连接和自然连接……用 哈希函数分别将两个表的元组划分成多个连接属性的值相等的集合…… 归并连接……假设参与连接的两张表已按连接关键字升序排列……归并 连接算法对每张表仅读一次",因此可以推出三类算法各自的前提条件和 效率特征。 - 原始内容:嵌套循环连接算法……仅需要对两张表进行全表扫描……哈希 连接适用于等值连接和自然连接……归并连接……假设参与连接的两张表 已按连接关键字升序排列……对每张表仅读一次。