HASH JOIN 散列连接
hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
(对以上的过程保持疑问,可能是RDMS的问题,在《数据库系统概念》一书中,hash join算法的思想是这样的:对两个关系的连接属性分别作hash,hash函数一定要有较好的随机性和均匀性,如果关系r的一个元组和关系s的一个元组满足连接条件,那么他们在连接属性 上有相同的值。如该值经散列函数映射为i,则关系s的那个元组必在H(ri)中,而关系s的那个元组必在H(si)中。因此,H(ri)中的元组只需与H(si)中的元组作比较,而没有必要与s的其他任何分区作比较。很明显这种算法比以上算法代价小的多。)

至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。

hash join可能有优势:
1,两个巨大的表之间的连接。
2,在一个巨大的表和一个小表之间的连接。
3,可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join

1.散列连接是CBO做大数据集连接时的常用方式.

2.也可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接

3.Hash join在两个表的数据量差别很大的时候.

4.Hash join的工作方式是将一个表(通常是小一点的那个表)做hash运算,将列数据存储到hash列表中,从另一个表中抽取记录,做hash运算,到hash列表中找到相应的值,做匹配。

当缺乏索引或者索引条件模糊时,哈希连接连接比嵌套循环有效。通常比排序合并SORT MERGE JOIN连接快。

在数据仓库环境下,如果表的纪录数多,效率高。

 
参考地址:http://blog.csdn.net/chengweipeng123/article/details/7235387
 
以下是自己做的一个小测试

hash查询: IO结果
hash查询: time结果

-----------------------------------------------------------------------------------------------------------------------

NOT hash查询: IO结果

NOT hash查询: time结果

sql 查询强制使用HASH连接性能测试比较的更多相关文章

  1. SQL各种连接查询详解(左连接、右连接..)

    一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的.语句1:隐式 ...

  2. MySQL从删库到跑路(五)——SQL查询

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 1.查询所有字段 在SELECT语句中使用星号“”通配符查询所有字段在SELECT语句中指定所有字段select f ...

  3. EF查询百万级数据的性能测试--多表连接复杂查询

    相关文章:EF查询百万级数据的性能测试--单表查询 一.起因  上次做的是EF百万级数据的单表查询,总结了一下,在200w以下的数据量的情况(Sql Server 2012),EF是可以使用,但是由于 ...

  4. SQL查询 - 表连接

    一.连接查询简介 连接查询中用来连接连个表的条件称为连接条件或连接谓词.其形式为: [<表1>].<列名1><连接运算符>[<表2>].<列2&g ...

  5. sql server 实现多表连接查询

    项目中要实现多表查询,用外连接实现. a表 a(aid,aname) 其中aid为pk b表 b(aid,bname,aid) 其中 bid为pk,aid为fk c表 c(cid,cname,aid) ...

  6. sql server 使用链接服务器连接Oracle,openquery查询数据

      对接问题描述:不知道正式库oracle数据库账户密码,对方愿意在对方的客户端上输入账号和密码,但不告诉我们 解决方案:使用一台sql server作为中间服务器,可以通过转存数据到sql serv ...

  7. 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例

    背景 今天在日常数据库检查中,发现一SQL运行时间特别长,于是抓取出来,进行优化. 优化前: 耗时:503s 返回:0 SQL代码 SELECT * FROM MM_PAYABLEMONEY_TD P ...

  8. 010.简单查询、分组统计查询、多表连接查询(sql实例)

    -------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SEL ...

  9. SQL查询性能分析

    http://blog.csdn.net/dba_huangzj/article/details/8300784 SQL查询性能的好坏直接影响到整个数据库的价值,对此,必须郑重对待. SQL Serv ...

随机推荐

  1. oracle linux 下卸载

    1. 关闭数据库 shutdown immeidate 2. 停止 Listener lsnrctl stop 3. 停止http服务(可选) service httpd stop 4. 用su或者重 ...

  2. poj2354Titanic(两点的球面距离)

    链接 球面距离计算公式:d(x1,y1,x2,y2)=r*arccos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2)) x1,y1是纬度\经度的弧度单位,r为地 ...

  3. Java中JTree的简单案例

    package ch12; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; /** * Created by ...

  4. 使用Ant打包工具 基本介绍

    由于使用java,javac,jar等工具进行编译打包,即繁琐低效又容易出错,因此Ant出现了. Ant的出现就是专门为了打包编译java代码的,使用之前得稍微学一下.Ant的运行起来主要是依靠配置文 ...

  5. Android控件_使用TextView实现跑马灯效果

    一.第一种方式: 通过TextView控件的自身属性实现(但是有缺点就是当多个TextView要实现这种效果的时候,只有第一个才有效果)  实现方法加上下面四个属性: android:singleLi ...

  6. hibernate模块

    hibernate-core : 核心模块,定义了 ORM 特性和API,还有各种集成的SPIs. hibernate-entitymanager : 定义 对 JPA(Java Persistenc ...

  7. jquery select选中项 赋值

    $("flag").attr("value",flag); $("#flag").find("option:selected&qu ...

  8. hiho_1069_最近公共祖先3

    题目 给出一棵家族树,树上的节点可以由名字唯一标识.给出若干个查询,查询的内容为两个名字,结果为两个名字的最近公共祖先. 题目链接: 最近公共祖先 分析 在线的RMQ + LCA 算法,先用dfs将树 ...

  9. 集成骨骼动画Spine的几点经验

    最近开始用cantk做些复杂的游戏,其中一个游戏的DragonBones骨骼动画的JSON文件就达600K,导出之后显示各种不正常,可能是太复杂了,有些方面达到了DragonBones的极限.拿到官方 ...

  10. aspcms标签使用经验

    1.调用导航栏标签写法,sort是网站后台栏目管理的编号{aspcms:type sort=19} <a href="[type:link]" title="[ty ...