HASH JOIN缓冲区是一个虚拟缓冲区——系统没有预先分配一块独立内存,而是在执行哈希连接时动态计算:若数据量未超阈值,直接从共享内存池(SHARE POOL)分配内存;
HASH JOIN适合等值连接和大数据量场景,会建立哈希表然后探测匹配,内存消耗较大。
查看当前参数值
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的有效上限,同时受物理内存限制,
文章
阅读量
获赞
