对oracle hash join trace的研究

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

初始化数据

create table t1 as select * from dba_objects;

create table t2 as select * from dba_objects;

insert into t2 select * from  dba_objects;

commit;

exec dbms_stats.gather_table_stats(user,‘t1‘);

exec dbms_stats.gather_table_stats(user,‘t2‘);

实验1,使用object_id关联,重复率低:

alter session set tracefile_identifier = ‘gg_20150618‘;

alter session set events ‘10104 trace name context forever, level 2‘;

select count(1) from t1,t2 where t1.object_id = t2.object_id;

alter session set events ‘10104 trace name context off‘ ;

Number of buckets with   0 rows:      75222

Number of buckets with   1 rows:      41633

Number of buckets with   2 rows:      11624

Number of buckets with   3 rows:       2218

Number of buckets with   4 rows:        341

Number of buckets with   5 rows:         32

Number of buckets with   6 rows:          1

Number of buckets with   7 rows:          1

Number of buckets with   8 rows:          0

Number of buckets with   9 rows:          0

Number of buckets with between  10 and  19 rows:          0

Number of buckets with between  20 and  29 rows:          0

Number of buckets with between  30 and  39 rows:          0

Number of buckets with between  40 and  49 rows:          0

Number of buckets with between  50 and  59 rows:          0

Number of buckets with between  60 and  69 rows:          0

Number of buckets with between  70 and  79 rows:          0

Number of buckets with between  80 and  89 rows:          0

Number of buckets with between  90 and  99 rows:          0

Number of buckets with 100 or more rows:          0

### Hash table overall statistics ###

Total buckets: 131072 Empty buckets: 75222 Non-empty buckets: 55850

Total number of rows: 73076

Maximum number of rows in a bucket: 7

Average number of rows in non-empty buckets: 1.308433

Disabled bitmap filtering: filtered rows=0 minimum required=50 out of=1000

qerhjFetch: max probe row length (mpl=0)

*** RowSrcId: 2, qerhjFreeSpace(): free hash-join memory

kxhfRemoveChunk: remove chunk 0 from slot table

实验2,使用object_type关联,重复率高:

alter session set tracefile_identifier = ‘gg_20150619‘;

alter session set events ‘10104 trace name context forever, level 2‘;

select count(1) from t1,t2 where t1.object_type = t2.object_type;

alter session set events ‘10104 trace name context off‘ ;

Number of buckets with   0 rows:     131027

Number of buckets with   1 rows:          3

Number of buckets with   2 rows:          2

Number of buckets with   3 rows:          2

Number of buckets with   4 rows:          2

Number of buckets with   5 rows:          1

Number of buckets with   6 rows:          0

Number of buckets with   7 rows:          1

Number of buckets with   8 rows:          0

Number of buckets with   9 rows:          4

Number of buckets with between  10 and  19 rows:          6

Number of buckets with between  20 and  29 rows:          2

Number of buckets with between  30 and  39 rows:          0

Number of buckets with between  40 and  49 rows:          1

Number of buckets with between  50 and  59 rows:          2

Number of buckets with between  60 and  69 rows:          0

Number of buckets with between  70 and  79 rows:          0

Number of buckets with between  80 and  89 rows:          0

Number of buckets with between  90 and  99 rows:          0

Number of buckets with 100 or more rows:         19

### Hash table overall statistics ###

Total buckets: 131072 Empty buckets: 131027 Non-empty buckets: 45

Total number of rows: 73080

Maximum number of rows in a bucket: 27803

Average number of rows in non-empty buckets: 1624.000000

Disabled bitmap filtering: filtered rows=0 minimum required=50 out of=1000

*** 2015-06-18 16:35:58.344

qerhjFetch: max probe row length (mpl=0)

*** RowSrcId: 2, qerhjFreeSpace(): free hash-join memory

kxhfRemoveChunk: remove chunk 0 from slot table

对比两个实验,你会发现,当Maximum number of rows in a bucket低的时候效率会高很多,当SQL中出现Maximum number of rows in a bucket高的情况,要想办法把它降低,打散。

时间: 2024-08-08 13:54:07

对oracle hash join trace的研究的相关文章

Sort merge join、Nested loops、Hash join(三种连接类型)

目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接): 首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序:最后两边已经排序的行被放在一起执行合并操作.排序是一个费时.费资源的操作,特别对于大表.所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序

oracle 表连接 - hash join 哈希连接

一. hash 连接(哈希连接)原理 指的是两个表连接时, 先利用两表中记录较少的表在内存中建立 hash 表, 然后扫描记录较多的表并探測 hash 表, 找出与 hash 表相匹配的行来得到结果集的表连接方法. 哈希连接仅仅能用于等值连接条件(=). 如果以下的 sql 语句中表 T1 和 T2 的连接方式是哈希连接, T1 是驱动表 select * from T1, T2 where T1.id = T2.id and T1.name = 'David'; oracle 运行过程例如以下

SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)

swap_join_inputs是针对哈希连接的hint,它的含义是让优化器交换原哈希连接的驱动表和被驱动表的顺序,即在依然走哈希连接的情况下让原哈希连接的驱动表变被驱动表,让原哈希连接的被驱动表变为驱动表. 注意,在swap_join_inputs hint中指定的目标表应该是原哈希连接中的被驱动表,否则oracle会忽略该hint. /*+ swap_join_inputs(原哈希连接的被驱动表) */ 其使用范例如下: 1 2 select /*+ leading(dept) use_ha

oracle表之间的连接之----->哈希连接(Hash Join)

哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 对于排序合并连接,如果两个表在施加了目标SQL中指定的谓词条件后得到的结果集很大而且需要排序,则排序合并连接的执行效率一定不高:而对于嵌套循环连接,如果驱动表所对应的驱动结果集的记录数很大,即便在被驱动表的连接列上存在索引,此时使用嵌套循环连接的执行效率也会同样不高.为了解决这个问题,于是ORACLE引进了哈希连接.在ORACLE 10g及其以后的版本中,优化器 (实际上是CBO,因为哈希连接仅

Oracle 表的连接方式(2)-----HASH JOIN的基本机制3

HASH JOIN的模式 hash join有三种工作模式,分别是optimal模式,onepass模式和multipass模式,分别在v$sysstat里面有对应的统计信息: SQL> select name, value from v$sysstat where name like '%workarea executions%'; optimal模式 optimal模式就是从build table上获取的结果集比较小,可以把整个hash table都建立在用户可以使用的内存区域里.下面这张图

Oracle 表的连接方式(2)-----HASH JOIN的基本机制1

我们对hash join的常见误解,一般包括两个: 第一个误解:是我们经常以为hash join需要对两个做join的表都做全表扫描 第二个误解:是经常以为hash join会选择比较小的表做build table 纠正第一个误解: 我们经常以为hash join需要对两个做join的表都做全表扫描,但实际情况HASH JOIN是不会限制SQL的访问方法的.我们用下面的测试来验证: --创建测试表probe_tab: SQL> create table probe_tab 2 initrans

Oracle 表的连接方式(2)-----HASH JOIN的基本机制2

Hash算法原理 对于什么是Hash算法原理?这个问题有点难度,不是很好说清楚,来做一个比喻吧:我们有很多的小猪,每个的体重都不一样,假设体重分布比较平均(我们考虑到公斤级别),我们按照体重来分,划分成100个小猪圈. 然后把每个小猪,按照体重赶进各自的猪圈里,记录档案. 好了,如果我们要找某个小猪怎么办呢?我们需要每个猪圈,每个小猪的比对吗? 当然不需要了. 我们先看看要找的这个小猪的体重,然后就找到了对应的猪圈了. 在这个猪圈里的小猪的数量就相对很少了. 我们在这个猪圈里就可以相对快的找到我

oracle多表连接方式Hash Join Nested Loop Join Merge Join

在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:        嵌套循环(Nested  Loops (NL))      (散列)哈希连接(Hash Join (HJ))    (归并)排序合并连接(Sort Merge Join (SMJ) ) 二.连接说明:    1.Oracle一次只能连接两个表.不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表.    2.当执行多个表的连接时,优化

深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图...

Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash表(build table),第2个探查表(probe table),一般不叫内外表,nested loop才有内外表       Hash表也就是所谓的内表,探查表所谓的外表       两者的执行计划形如:       nested loop           outer table