GBase 8a
运维管理
文章

GBase 8a集群group_concat函数常见问题分析

发表于2025-05-27 10:40:33290次浏览1个评论

GBase 8a集群的group_concat函数支持对同一分组内聚集列字符串进行连接,在OLAP应用中有一定的使用场景需求。

 

笔者根据项目实施过程中group_concat函数使用的常见问题进行分析总结,主要内容如下:

验证集群环境:版本8.6.2_build33,版本9.5.2

1、SQL报错:Aggregation function group_concat(......) overflow

1)确认group_concat_max_len参数大于最大汇聚行宽,可通过select key,sum(length(value)) group by key order by sum(length(value)) desc确认。

2)设置合适的group_concat_max_len参数,建议参数值可容纳最大的汇聚行宽即可,过大的值可能会引起性能问题或buffer溢出问题。

group_concat_max_len参数上限值(参考产品手册):较老的版本为32767,约可容纳1000个字符,V8.6.2.43-R6及以后的版本为64MB,可以通过set global group_concat_max_len = xxx设置,在新session生效。

3)增大集群gbase_hgrby_buffer参数,如集群并发任务较多,慎重设置。

4)减小汇聚字段长度定义,包括key、value,降低buffer的使用量。

5)用参数topN限制汇聚长度。

6)拆分数据,减小单次汇聚数据量。

2、SQL报错:too large gbase_buffer, has exceeded the gbase_buffer_hgrby

buffer是执行时申请的,可能会动态报错,可尝试调大buffer或减小单次处理数据量

3、group_concat汇聚提速:

首先group_concat_max_len参数的值设置要合理,在满足汇聚行宽的情况下,尽量设小,否则性能影响很大。

如果汇聚结果集过大出现跑多趟的情况(这个可以通过打开trace观察到,此处不展开),可考虑增大gbase_hgrby_buffer或减小行宽(group_concat_max_len),增加汇聚线程每趟处理的记录数,减少跑的趟数。

 

参考案例:

问题描述:

某集群FZ业务SQL报错Aggregation function group_concat...... overflow

问题分析:

根据测试结果,Aggregation function group_concat...... overflow异常出现的场景有2种情况:

1)汇聚单行行长超过group_concat_max_len参数,比如该例最大汇聚行长112个字符(约300多字节),设置为300以下会报错,设置为400不报错。

2)group_concat_max_len设置过大,导致buffer不足,比如该例,当设置为1024时,gbase_buffer_hgrby取默认值,报错,gbase_buffer_hgrby取默认值2倍,不报错,如group_concat_max_len设置更大,gbase_buffer_hgrby也必须更大,才不会报错。

所以根据现象推测group_concat的处理逻辑:将所有的数据都纳入buffer中汇总,可以汇聚的行数为buffer/行长,行长与group_concat_max_len有关,设置约大,可容纳行数越少。

如果group_concat_max_len设置小于单行行长,会报错,如果group_concat_max_len设置过大,导致buffer无法装下所有的行,也会报错。

问题原因:

1)节点数较少,单节点数据量过大,group_concat_max_len及buffer参数设置不合理,导致汇聚buffer溢出。

优化方法:

1)设置合理的group_concat_max_len参数。建议根据汇聚宽度设置合理值,不宜过大。

根据目前情况初步设置为1024(字节),约可以容纳300个字符长度。

2)适当增大集群buffer参数gbase_buffer_hgrby。考虑集群有较大并发,不宜过大,建议设置为默认值2倍(4G)。

3)尽量减小汇聚字段长度定义(包括key,value字段),比如: phone_no, roam_type_id。

4)用topN限制汇聚长度。

5)拆分表,减小单次汇聚数据量。比如拆分为原表的1/4。

评论

登录后才可以发表评论
用户头像
levvel发表于 2个月前
读书破万卷,下笔如有神