当前位置: 首页 > news >正文

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
    ~ 连接类型及谓词条件的可选性
    ~ 是否可以执行并行连接

    

相关文章:

  • [转]MONO之Red Hat5.5企业版 Linux系统ASP.NET环境配置
  • 电信SDK Pay函数里面System.out.print 无输出消息
  • Sexy Bookshelf性感书架
  • 在Linux上安装SVN服务
  • 一步步教你如何用疯狂.NET架构中的通用权限系统 -- 如何控制用户显示的菜单权限...
  • 【解决问题】输入法切换时显示已经删除了的微软拼音
  • MediaInfo源代码分析 2:API函数
  • MS Chart相关
  • Flash Media Live Encoder 使用帮助
  • 感恩的心
  • 视频编码国家标准AVS与H.264的比较(节选)
  • dedecms5.3整合dz 7.0方法
  • linux学习命令总结⑩
  • ArcServer的Ajax实现(3)
  • 重新启用的邮箱账户发送邮件退信解决
  • canvas 五子棋游戏
  • css属性的继承、初识值、计算值、当前值、应用值
  • fetch 从初识到应用
  • flutter的key在widget list的作用以及必要性
  • JavaScript 一些 DOM 的知识点
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Logstash 参考指南(目录)
  • mongo索引构建
  • PAT A1120
  • PhantomJS 安装
  • Python进阶细节
  • Service Worker
  • 大快搜索数据爬虫技术实例安装教学篇
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 计算机常识 - 收藏集 - 掘金
  • 开源SQL-on-Hadoop系统一览
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 利用jquery编写加法运算验证码
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • puppet连载22:define用法
  • Semaphore
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​一些不规范的GTID使用场景
  • #pragma data_seg 共享数据区(转)
  • #Z2294. 打印树的直径
  • (8)STL算法之替换
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)Eureka服务搭建,服务注册,服务发现
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (算法)Travel Information Center
  • (转)为C# Windows服务添加安装程序
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core中Emit的使用
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】