【YashanDB 知识库】swap 空间使用超大报错
问题描述
问题单
使用 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 空间流程
调用流程
![](https://static001.geekbang.org/infoq/5f/5f04a849588a9053ecdd3517a4648e62.png)
group_concat
group_concat 返回 lob 类型,每一个分组都会申请一个 lob 空间
string 转 lob 时,tmpVar 是源表字段数据,调用 anlLobAppend 给 value->vLob 申请 lob 对象空间
![](https://static001.geekbang.org/infoq/ea/eacb25dd237549d414cc1f8c76a6f4d4.png)
![](https://static001.geekbang.org/infoq/aa/aad15c2da0dc1ea6d6584dbcf178a355.png)
![](https://static001.geekbang.org/infoq/60/601a464a5f479f8a6939918fecba7285.png)
VM 空间申请
调用流程
复制代码
![](https://static001.geekbang.org/infoq/15/15d4f85485685f78cea85b81e7ffcdae.png)
申请空间:
![](https://static001.geekbang.org/infoq/19/19e3cf5d7666cd62b1788f516335adc6.png)
如上 unitBlocks = 8,申请 8 个块的空间
![](https://static001.geekbang.org/infoq/9e/9eda6d6a1f28879d0d5ff48427624ef4.png)
如下:4 是 swap 的表文件 id
![](https://static001.geekbang.org/infoq/83/831ce0c200550667e60fb74d4a3f55e8.png)
![](https://static001.geekbang.org/infoq/4e/4e4466dde82e1d7030f87c3fbe16ef32.png)
VM 空间扩展
调用流程
复制代码
一次扩大,写 64M 空间,8192*8192
![](https://static001.geekbang.org/infoq/a9/a944f235b2e32f1f4715cce975528649.png)
![](https://static001.geekbang.org/infoq/5d/5dd331bd93642371a2870b13ad4e745f.png)
![](https://static001.geekbang.org/infoq/a0/a0a9f78c730e96d51308fed6632d844a.png)
评论