暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle hash连接

不加糖 2025-03-08
206

两表关联返回少量数据应该走嵌套循环,两表关联返回大量数据应该走HASH连接。
HASH连接的算法:两表等值关联,返回大量数据,将较小的表选为驱动表,将驱动表的“SELECT列和JOIN列”读入PGA中的WORK AREA,然后对驱动表的连接列进行hash运算生成hash table,当驱动表的所有数据完全读入PGA中的WORK AREA之后,再读取被驱动表(被驱动表不需要读入PGA中的WORK AREA中),对被驱动表的连接列也进行hash运算,然后到PGA中的WORK AREA去探测hash table,找到数据就关联上,找不到数据就没关联上。

在HASH连接中,有驱动顺序, 驱动表和被驱动表都只会访问0次或者1次

在HASH连接中,无须排序,消耗PGA内存是因为用于建立HASH表,当驱动表太大、PGA不能完全容纳驱动表时,驱动表就会溢出到临时表空间,进而产生磁盘HASH连接,这时候HASH连接性能会严重下降。

嵌套循环每循环一次,会将驱动表连接列传值给被驱动表的连接列,也就是说嵌套循环会进行传值。HASH连接没有传值的过程列在进行HASH连接的时候,被驱动表的连接列会产生HASH值,到PGA中去探测驱动表所生成的hash table。HASH连接的驱动表与被驱动表的连接列都不需要创建索引。

OLAP环境多数SQL都是大规模的ETL,此类SQL返回的结果集很多,SQL执行计划通常以HASH为主,往往要大量消耗PGA,所以OLAP系统PGA设置较大。

在HASH连接 连接要特别注意驱动表的顺序,小的结果集先访问,大的结果集后访问,才能保证被驱动表的访问次数降到最低,从而提升性能。

嵌套循环查询HINT用法:/+leading(t1) use_hash(t2)/,其中t1为驱动表,t2为被驱动表

SELECT /+leading(t1) use_hash(t2)/ * FROM T1 INNER JOIN ON T1.ID = T2.ID。

HASH连接主要用于处理两表等值关联

不支持HASH连接的连接条件:连接条件是<> > <或者LIKE导致HASH连接无法使用

1、怎么优化HASH连接

(1)因为HASH连接需要将驱动表的select列和join列放入PGA中,所以,应该尽量避免书写select * from …语句,将需要的列放在select list中,这样可以减少驱动表对PGA的占用,避免驱动表被溢出到临时表空间,从而提升性能。如果无法避免驱动表被溢出到临时表空间,可以将临时表空间创建在SSD上面或者RAID 0上,加快临时数据的交换速度。

(2)HASH连接驱动表看什么,看体积还是看行数?HASH看体积,NL看行数。HASH看体积,因为HASH是要全部放内存的。HASH因为单个进程最大2G,所以要看体积。

(3)HASH连接驱动表非常大怎么优化?开并行,并行之后就不是一个进程在HASH。

2、HASH连接需要注意地方

(1)HASH JOIN在OLTP环境一般没有什么优化的地方,在OLAP环境中可以利用并行优化HASH JOIN。

(2)利用等待事件监控HASH JOIN的时候,如果发现在做on-disk HASH JOIN(direct path read/write temp),可以加大PGA,或者手工设置work area分配较大的PGA内存。

(3)在做SQL优化的时候,你要检查HASH JOIN的JOIN列(通过HASH JOIN前面的ID去找ACCESS)选择性很低,那么HASH JOIN可能跑很久,这个时候可以尝试构造伪列进行JOIN,如果无法构造伪列,这个时候看看能否从业务上优化,就不要想着SQL优化了。

(4)HASH JOIN选择小表做驱动表,小表指的不是表的行数,而是指的是行数*列宽度。

(5)HASH JOIN只能用于等值连接。

3、一般看到SQL里面有什么要走hash join ?
答:一般看到group by,sum,avg,max,min,distinct,count 就要走hash join,注意这是一般情况下

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论