zoukankan      html  css  js  c++  java
  • HASH JION AND NESTED JION

    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/sssbbbryj/article/details/27795905

    
    关于HASH_JION的原理
    我们在做hash_join关联的时候,通常会有两张表,
    当中较小的表我们叫做:build input
    较大的表我们叫做:probe input ;
    那么oracle是怎样让这两张表做关联的呢?
    首先,oracle会选择build input。将其读入到内存中。
    这里oracle会给hash_join一块单独的内存叫hash area。
    假设build input小于指定的hash area则。再对probe input做hash 链接
    假设我们的build input大于指定的hash area,
    则build input和probe input做分区处理,将这两个划分到
    不同的分区中去,假设划分后大小合适的话,则读入到hash area中做hash处理
    假设划分后还是比較大的话,oracle会做nested—loops hash join处理,
    直到符合hash area的大小。

    ABOUT NESTED JOIN
    这个连接的方法中有驱动表(外部表)的概念。

    事实上这个连接就是2层的嵌套循环问题。所以外层的循环表越小越好。
    这样从理论上来说循环的次数将会降低,这也就是我们为什么将小表或者row source较小的表
    作为外层循环表的理论根据。

    由于在正确的选择中这种处理方式从理论上来说将会降低I/O的数量

    可是这个也不是绝对的根据。

    我们决定的那张表为驱动表也就是外部表对SQL的运行效率有重要的影响。其内部的连接方式是:
    row source1的row1-->probe row source2(驱动表,外部表)
    row source1的row2-->probe row source2(驱动表,外部表)
    row source1的row3-->probe row source2(驱动表,外部表)
    从它的运行原理上我们也可以看到row source2选择的重要性。

    当然假设row source1比較小的话。这种运行方式的效率也会更高。
    普通情况下row source1通过index去訪问row source2的话效率也会更高,当然前提是row source2必须有index。
    row source1去匹配row source2的全部行,假设有匹配的结果,则将其放入将要返回的结果集中。

    看到这里,我们可能会想到,使用这种方式。原理上我们一定须要遵守两种最简单的条件。当然假设
    不满足的话也没关系,仅仅只是性能上会差一些吧,
    (1)我们在选择驱动表(外表)的时候尽量的选择小一些的,这样理论上物理的I/O将将会少一些。

    (2)尽量的在驱动表上建立索引,这种话查询的效率会高一些。
     
  • 相关阅读:
    iView -- TimePicker 自定义修改时间选择器选择时间面板样式
    Go语言--容器:存储和组织数据的方式--数组、切片
    php递归实现一维数组转为指定树状结构 --- 省市区处理
    Go语言--基础语法笔记
    Mongodb 安装错误汇总
    GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?
    GIt -- fatal: refusing to merge unrelated histories 问题处理
    Linux -- Centos6 yum安装相关问题与处理
    Linux -- Xshell ,Xftp远程连接中文乱码怎么解决?
    Laravel 多数据库配置及查询操作
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10605843.html
Copyright © 2011-2022 走看看