本章提要
-----------------------------------------查询优化器要确定多张表的连接顺序和连接方法, 目的是通过尽早的过滤不需要的数据, 减少要处理的数据量.本章会介绍3种基本连接方法: 嵌套循环连接, 合并连接, 哈希连接如何选择连接放的的基本建议.-----------------------------------------10.1 定义 连接树 数据库引擎支持的所有的连接方法都是每次只能处理两个数据集. 它们被称作 左节点 和 右节点, 当需要对两个以上的数据集连接时, 查询优化器会评估不同的连接树. 1) 左深树 查询优化器最常用的连接树 它的每个连接都有一张表(是表, 而不是前面的表的生成的结果集)作为右节点. ------------------------------------- | Id | Operation | Name | ------------------------------------- | 1 | HASH JOIN | | | 2 | HASH JOIN | | | 3 | HASH JOIN | | | 4 | TABLE ACCESS FULL| T1 | | 5 | TABLE ACCESS FULL| T2 | | 6 | TABLE ACCESS FULL | T3 | | 7 | TABLE ACCESS FULL | T4 | ------------------------------------- 2) 右深树 很少被查询优化器使用 3) 锯齿形树 它的每个连接至少有一个表作为输入, 但是基于这个表的输入有时在左边, 有时在右边, 很少被使用 4) 浓密树 它的两个输入可能都不是表, 也就是说, 这种树的结构是完全自由的. 查询优化器只有在没有别的选择的时候才会选择它. 限制条件与连接条件 实际上, 在传统的连接语法中, where子句同时用来表明连接条件与限制条件, 相反, 在ANSI-标准的连接语法先, 限制条件是在WHERE 子句中定义的, 而连接条件是在FROM子句中定义. ~ 两个数据集通过连接条件进行连接; ~ 在连接返回的结果集上应用限制条件. 也就是说, 在两个表连接的时候, 连接条件是为了防止出现交叉连接(笛卡尔积), 对应的, 限制条件是为了过滤前一个操作(例如 表 连接)的结果集, 例如.-- emp.deptno = dept.deptno 是连接条件-- dept.loc = 'DALLAS' 限制条件select emp.ename from emp, dept where emp.deptno = dept.deptno and dept.loc = 'DALLAS'