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)尽量的在驱动表上建立索引,这种话查询的效率会高一些。
     
  • 相关阅读:
    误删除pycharm项目中的文件,如何恢复?
    Python/PHP 远程文件/图片 下载
    Python 字节与字符串的转换
    Python中的Json模块dumps、loads、dump、load函数介绍
    Python 连接数据库失败
    Python 模块搜索路径
    Python 操作 PostgreSQL 数据库
    从shell(终端)中退出python
    URL 传参中需要处理的特殊字符
    PHP 命名空间和自动加载
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10605843.html
Copyright © 2011-2022 走看看