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

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. PIE SDK内存栅格数据的创建

    1. 功能简介 目前在地理信息领域中数据包括矢量和栅格两种数据组织形式.每一种数据有不同的数据格式,目前PIE SDK支持多种数据格式的数据创建,下面对内存栅格数据格式的数据创建功能进行介绍. 2.  ...

  2. 完全原生javascript简约日历插件,js、html

    效果图: 效果如图所示,尽管看上去并不是很美观,但是,基本上的功能还是已经完成了,码了一天多的时间,权当做复习一下js吧. 整个做下来差不多码了500多行代码~其实只是很多的样式也包括了在其中了,虽然 ...

  3. GraphQL 暂停

    别人的文章 http://blog.csdn.net/imwebteam/article/details/53888708 Java 文档都打不开,已经在GitHub上提了 in README.md ...

  4. 网页引用Font Awesome图标

    问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...

  5. Apache Beam中的函数式编程理念

    不多说,直接上干货! Apache Beam中的函数式编程理念 Apache Beam的编程范式借鉴了函数式编程的概念,从工程和实现角度向命令式妥协. 编程的领域里有三大流派:函数式.命令式.逻辑式. ...

  6. ElasticSearch 2.1.1学习及总结

    Install & Up cd elasticsearch-2.1.1/bin ./elasticsearch ./elasticsearch --cluster.name my_cluste ...

  7. 《Python编程从入门到实践》_第十章_文件和异常

    读取整个文件 文件pi_digits.txt #文件pi_digits.txt 3.1415926535 8979323846 2643383279 下面的程序打开并读取整个文件,再将其内容显示到屏幕 ...

  8. MVC3.0与MVC2.0的区别

    昨天面试时第一回用MVC2.0做了一个简单的增删改查功能的测试.想一下用了一年多的MVC3.0,对这两个版本不同之处做以下几点总结: 最明显的是MVC3.0较MVC2.0而言,多了Razor视图: 1 ...

  9. js之strict模式

    JavaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量.这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量: i = 10 ...

  10. keepalived+nginx 高可用集群

    一.什么是高可用?   nginx做负载均衡,能达到分发请求的目的,但是不能很好的避免单点故障. 1.nginx集群单点问题 分发器宕机怎么处理? 假如nginx服务器挂掉了,那么所有的服务也会跟着瘫 ...