首页 > 代码库 > 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
10-1


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