最近在项目中调试存储过程碰到一些关于hash及分组相关的性能问题
示例1:在调试过程中, 该sql执行很久后面报超出全局 hash join 空间的错误,重新调整HJ_BUF_GLOBAL_SIZE ,执行一个小时也不出结果。
INSERT INTO t_test
(SELECT FundID,
SeatNo,
SUM(Balance),
SUM(Available),
SUM(IncomeAmt),
'20240807',
'Y'
FROM TESTA
GROUP BY FundID,SeatNo) ;
sql执行计划如下
上面主要是查询分组聚合太慢 ,可以通过hint 放大harg的桶数和单个操作符的内存:
/*+USE_DHASH_FLAG(3) HAGR_HASH_SIZE(100000000) HAGR_BLK_SIZE(50) HAGR_BUF_SIZE(3000) HAGR_BUF_GLOBAL_SIZE(18000) */
参数说明:
上面sql在debug调试中加了并行,debug的时候一直在执行不结束,单独拿出来在另外一个窗口执行很快出结果。原因未知,在调试过程中尽量不要加并行。
示例2:下面sql执行也一样慢SELECT FundID, SeatNo, InvTP,SUM(Balance),
SUM(Available), SUM(IncomeAmt),
'20240807', 'Y'
FROM TESTA t, TESTB s
WHERE t.FundAcct = s.FundAcct
GROUP BY FundID,SeatNo,InvTP;
上面执行计划用到了hash和hagr,hagr参数可以按照上面示例1来调整,
hash可以通过调整HJ_BUF_SIZE和JOIN_HASH_SIZE避免hash连接刷盘和hash冲突,来提升效率
JOIN_HASH_SIZE 设置成驱动表的记录数稍大的整数即可