注册
超出全局hash join空间
专栏/技术分享/ 文章详情 /

超出全局hash join空间

2026/07/17 168 0 0
摘要

HASH JOIN空间

HASH JOIN缓冲区是一个虚拟缓冲区——系统没有预先分配一块独立内存,而是在执行哈希连接时动态计算:若数据量未超阈值,直接从共享内存池(SHARE POOL)分配内存;

HASH JOIN适合等值连接和大数据量场景,会建立哈希表然后探测匹配,内存消耗较大。

三大核心参数

image.png

查看当前参数值

SELECT PARA_NAME, PARA_VALUE, MIN_VALUE, MAX_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('HJ_BUF_GLOBAL_SIZE', 'HJ_BUF_SIZE', 'HJ_BLK_SIZE');

典型故障现象

dm.jdbc.driver.DMException: 超出全局 hash join 空间,适当增加HJ_BUF_GLOBAL_SIZE

远程操作符执行失败,错误详情[Out of hash join buf space, please increase HJ_BUF_GLOBAL_SIZE]

故障处理方案

方案一:扩大全局缓存

-- 修改HJ_BUF_GLOBAL_SIZE SP_SET_PARA_VALUE(1, 'HJ_BUF_GLOBAL_SIZE', 8000);

注意:HJ_BUF_GLOBAL_SIZE是动态参数,此修改立即生效,无需重启。但调大数值需结合实际物理内存和空闲大小,过大可能导致OOM。一般不建议修改该值。

方案二:优化SQL语句

1、优先找到慢SQL进行优化,减少不必要的HASH JOIN:
2、对远程表查询时,用WHERE条件限制返回数据量
3、避免复杂子查询或大表连接
4、将查询结果先缓存到临时表再进行后续处理
5、如果被连接的数据集较小,可考虑改为索引连接(NEST LOOP INDEX JOIN),减少内存开销

方案三:降低单个操作符上限

适当减小HJ_BUF_SIZE,让单个查询占用更少内存:

SP_SET_PARA_VALUE(1, 'HJ_BUF_SIZE', 200);

如果需要紧急修复的话,可以优先尝试该方案。

关键注意事项

内存来源:HASH JOIN缓冲区从共享内存池(SHARE POOL)分配,需确保MEMORY_POOL充足且物理资源充足。调大限制不超过500,000 MB的有效上限,同时受物理内存限制,

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服