写点什么

【YashanDB 知识库】swap 空间使用超大报错

作者:YashanDB
  • 2024-07-17
    广东
  • 本文字数:1209 字

    阅读完需:约 4 分钟

问题描述

问题单

使用 GROUP_CONCAT 函数时,数据库 swap 表空间上涨厉害

测试用例

drop table tmp1;create table tmp1(c1 int,c2 double,c3 varchar(500),c4 int); beginfor i in 1 .. 4994196 loopinsert into tmp1 select random()*100000000,random()*5000000,'hello world test xxxxxiio','' from dual;end loop;commit;end;/ select c1,c2,LISTAGG(c3) value_list from tmp1 where c4 is null group by c1,c2 having to_char(LISTAGG(c3)) = '15395169080,15395169080';-- 能出结果,(swap空间590M) 源表数据2百多M,这个group_concat sql使用1百多G swap空间还不够select c1,c2,group_concat(c3) value_list from tmp1 where c4 is null group by c1,c2 having to_char(group_concat(c3)) = '15395169080,15395169080';-- 出不来结果,swap空间越来越大,(直到128.063G,报错退出)YAS-02025 no free space in virtual memory pool select c1,c2,group_concat(c3) value_list from tmp1 where c4 is null group by c1,c2 ;-- 能出结果,swap空间一直增大(直到33.188G,报错退出)YAS-00103 no free block in application pool select c1,c2,group_concat(c3) value_list from tmp1 group by c1,c2-- 能出结果,swap空间一直增大(直到33.188G,报错退出)YAS-00103 no free block in application pool select c1,c2 from tmp1 group by c1,c2 ;-- 能出结果,swap空间到一定大小停下(128M)4994196行 select group_concat(c3) value_list from tmp1 ;-- 能出结果,swap空间一定大小停下(252M) select * from (select c1,c2,group_concat(c3) value_list from tmp1 where C4 is null group by c1,c2) where to_char(value_list) = '15395169080,15395169080';
复制代码

结论

  • 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 空间申请

调用流程


vmAllocAndOpendoVmAllocvmAllocSwapvmAllocExtendspcAllocExtentdoAllocExtspcAllocDataFileExt
复制代码



申请空间:



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



如下:4 是 swap 的表文件 id



VM 空间扩展

调用流程


spcAllocExtentdoExtendExtspcExtendDatafiledfExtenddbExtendDevicedbBuildDeviceBlockswriteDevicewriteFilewrite
复制代码


一次扩大,写 64M 空间,8192*8192





用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】swap空间使用超大报错_yashandb_YashanDB_InfoQ写作社区