当前位置:  数据库>oracle

哈希连接(hash join) 原理

    来源: 互联网  发布时间:2017-05-28

    本文导语: 这三类表连接方式是Oracle最基本的连接方式: 哈希连接(hashjoin) 访问次数:驱动表和被驱动表都只会访问0次或1次。驱动表是否有顺序:有。是否要排序:否。应用场景: 1. 一个大表,一个小表的关联;2. 表上没有索引;3. 返回...

这三类表连接方式是Oracle最基本的连接方式:

哈希连接(hashjoin)

访问次数:驱动表和被驱动表都只会访问0次或1次。
驱动表是否有顺序:有。
是否要排序:否。
应用场景: 1. 一个大表,一个小表的关联;
2. 表上没有索引;
3. 返回结果集比较大。

原理我们说的简单一点,先把驱动表的关联字段hash到PGA中(当然rowid也在PGA中),然后扫描被驱动表,取第一条数据,将关联的字段hash 一下探测PGA中的小表,如果匹配则关联,再取第二条........。

下面我们来做个试验:

SQL> create table test1 as select * from dba_objects where rownum create table test2 as select * from dba_objects where rownum exec dbms_stats.gather_table_stats(user,'test1');
SQL> exec dbms_stats.gather_table_stats(user,'test2');
SQL> alter session set statistics_level=all;

SQL> select /*+leading(t1) use_hash(t2)*/count(*)
from test1 t1, test2 t2
where t1.object_id = t2.object_id;
COUNT(*)
----------
100

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 3f2mts0kt82u2, child number 0
-------------------------------------
select /*+leading(t1) use_hash(t2)*/count(*) from test1 t1, test2 t2 where t1.object_id = t2.object_id
Plan hash value: 2544416891

------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 19 | | | |
|* 2 | HASH JOIN | | 1 | 100 | 100 |00:00:00.01 | 19 | 1066K| 1066K| 1162K (0)|
| 3 | TABLE ACCESS FULL| TEST1 | | 100 | 100 |00:00:00.01 | 4 | | | |
| 4 | TABLE ACCESS FULL| TEST2 | | 1000 | 1000 |00:00:00.01 | 15 | | | |
------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")


SQL> select /*+leading(t1) use_hash (t2)*/count(*)
from test1 t1, test2 t2
where t1.object_id = t2.object_id
and t1.object_id = 99999;
COUNT(*)
----------
0

更多详情见请继续阅读下一页的精彩内容:


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 哈希表及其概念
  • 哈希函数生成器 gperf
  • 哈希函数的构造方法及举例
  • C++获取文件哈希值(hash)和获取torrent(bt种子)磁力链接哈希值
  • 哈希表处理冲突的方法
  • 哈希算法计算 Generic Hash and HMAC Program
  • 高性能分布式哈希表FastDHT介绍及安装配置
  • 哈希计算工具 GtkHash
  • python内置映射类型(mapping type):dict哈希字典遍历方式及其它用法举例
  • C语言哈希函数库 murmur3
  • 文件哈希计算器 fHash
  • 哈希算法库 MurmurHash
  • C++的哈希算法库 hashlib++
  • C语言哈希表 uthash
  • 哈希计算工具 java-hash
  • 哈希测试 SMHasher
  • 分布式哈希表 FastDHT
  • 哈希表的问题?
  • 哈希算法
  • 哈希函数 Sphlib
  • Java 对象哈希映射库 JOhm


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,