问题描述
问题单
使用GROUP_CONCAT函数时,数据库swap表空间上涨厉害
测试用例
结论
- 23.2版本尝试该问题,现象相同。
- 确认内置函数group_concat,该函数返回lob类型,导致vm大量增长。该接口需要优化。
规避方法:
可以使用listagg替换group_concat。但是如果超过8000个字节,文本会被截断。
分析代码发现,group_concat返回的是lob类型,每一个分组都会申请一个lob空间,每一个lob空间都是88K大小,测试例子有4994196分组,所以它就会申请49941968*8K大小空vm空间,大概是304.8G大小,才能跑完,导致的问题。
代码分析如下
group_concat申请VM空间流程
调用流程

group_concat
group_concat返回lob类型,每一个分组都会申请一个lob空间
string转lob时,tmpVar是源表字段数据,调用anlLobAppend给value->vLob申请lob对象空间



VM空间申请
调用流程

申请空间:

如上unitBlocks = 8,申请8个块的空间

如下:4是swap的表文件id


VM空间扩展
调用流程
一次扩大,写64M空间,8192*8192




393

被折叠的 条评论
为什么被折叠?



