首页 > 代码库 > 10 表连接优化
10 表连接优化
本章提要
-----------------------------------------
查询优化器要确定多张表的连接顺序和连接方法, 目的是通过尽早的过滤不需要的数据, 减少要处理的数据量.
本章会介绍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‘
一方面, 连接条件可用来过滤数据, 另一方面, 为了最大程度的降低连接使用的数据量, 限制条件可能会在连接条件之前进行评估,
例如, 上例, 虽然书写的位置是限制条件在连接条件之下, 但是请注意限制条件 dept.loc = ‘DALLS‘是在连接条件之前应用的.
10.2 嵌套循环连接(nested loops)
分为外部循环和内部虚幻, 外部循环为左子节点, 内部循环为右子节点, 当外部循环执行一次的时候, 内部循环需要针对外部循环
返回的每条记录执行一次. 嵌套循环有以下几点特征:
~ 左子节点(外部循环)只会执行一次, 而右子节点(内部循环)一般会执行很多次.
~ 在所有数据处理完之前, 就可以返回结果集的第一条记录.
~ 可以有效的利用索引来处理限制条件与连接条件
~ 支持所有类型的连接.
10.3 合并连接
处理合并连接的时候, 两个数据集都会被读出来, 并按照连接条件的字段进行排序, 当这些操作一完成, 两个工作区的内容就会被
合并, 特征:
~ 每个子节点只会执行一次
~ 每个输入数据集都必须按照连接条件的字段进行排序
~ 由于这些排序操作, 在返回结果集的第一条记录之前, 两个输入数据集都必须被完全读出并排序.
~ 所有的连接类型都支持合并连接.
还有哈希连接, 外连接等
10.6 选择连接的方法
需要考虑以下几个方面:
~ 优化器目标, first_rows 还是 all_rows
~ 连接类型及谓词条件的可选性
~ 是否可以执行并行连接