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

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)尽量的在驱动表上建立索引,这种话查询的效率会高一些。
 

HASH JION AND NESTED JION的更多相关文章

  1. Sql优化(一) Merge Join vs. Hash Join vs. Nested Loop

    原创文章,首发自本人个人博客站点,转载请务必注明出自http://www.jasongj.com Nested Loop,Hash Join,Merge Join介绍 Nested Loop: 对于被 ...

  2. Merge join、Hash join、Nested loop join对比分析

    简介 我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join ...

  3. MySQL之left jion 、 right jion 和inner jion 的区别和使用方法

    left jion   左联结 right jion 右联结 inner jion 等值联结 create table teacher( tid ) primary key auto_incremen ...

  4. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

  5. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

  6. oracle 表连接 - hash join 哈希连接

    一. hash 连接(哈希连接)原理 指的是两个表连接时, 先利用两表中记录较少的表在内存中建立 hash 表, 然后扫描记录较多的表并探測 hash 表, 找出与 hash 表相匹配的行来得到结果集 ...

  7. OPTIMIZER_INDEX_COST_ADJ 与OPTIMIZER_INDEX_CACHING 参数说明

    [部分转载]http://www.xifenfei.com/2012/06/optimizer_index_caching和optimizer_index_cost_adj参数说明.html 1. O ...

  8. 如何在不改SQL的情况下优化数据库

    主题简介 在数据库运维中我们会遇到各种各样的问题,这些问题的根源可能很明显,也可能被某种表象掩盖而使我们认不清.所以运维面临的两大问题就是,第一我们没有看清本质,第二应用不允许修改.那么我们如何解决这 ...

  9. MVCC PostgreSQL实现事务和多版本并发控制的精华

    原创文章,同步发自作者个人博客,http://www.jasongj.com/sql/mvcc/ PostgreSQL针对ACID的实现机制 事务的实现原理可以解读为RDBMS采取何种技术确保事务的A ...

随机推荐

  1. Yii1 的数据库操作整理

    1.根据条件查询一个集合 $objectResult=Post::model()->findAll($condition,$params);$objectResult=Post::model() ...

  2. harbor 仓库搭建

    一,介绍 Harbor是一个用于存储Docker镜像的企业级Registry服务. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry ...

  3. 从指定Dictionary中移除指定值项

    void Removeltems(Dictionary<int, ltem> _dicltemMap, ltem _item) { List<ltem> keys=new Li ...

  4. FZU 2207 ——以撒的结合——————【LCA + 记录祖先】

    Problem 2207 以撒的结合 Accept: 47    Submit: 161Time Limit: 1000 mSec    Memory Limit : 32768 KB  Proble ...

  5. Ubuntu系统修改Python软链接

    1.查看使用的版本 python --version 2.查看当前所使用版本的位置 which python 3.如果第二步结果是 /usr/bin/python 则直接删除即可 sudo rm /u ...

  6. sql 创建用户脚本

    USE master go  CREATE LOGIN jiazhuang --用户名 WITH PASSWORD = 'sa', --密码 DEFAULT_DATABASE = JiaZhuan, ...

  7. 使用ANY、Some或All关键字

    可以使用All或Any关键字修改引入子查询的比较运算符.Some是与Any等效的ISO标准,All要求Where表达式与子查询返回的每个值进行比较时都应满足比较条件,Any则要求Where表达式与子查 ...

  8. windows使用bat文件定时备份文件

    遇到一个需求,需要备份Access数据库,Access生成的数据都保存在xx.mdb文件中,所以考虑使用windows任务 定时执行一个备份文件的bat文件来解决这个问题. backup.bat文件代 ...

  9. div居中方法总结

    在日常开发过程中,我们会经常使用到div居中来处理布局,今天我就把我在开发过程中,遇到的div居中处理方法总结一下,方便日后查看!        1. 水平居中:给div设置一个宽度,然后添加marg ...

  10. 码农的好助手:版本管理工具git的使用

    一.什么是github? GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 4 月 10 日 ...