问题描述

问题单

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

测试用例

drop table tmp1;
create table tmp1(c1 int,c2 double,c3 varchar(500),c4 int); begin
for i in 1 .. 4994196 loop
insert 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空间申请

调用流程

vmAllocAndOpen
doVmAlloc
vmAllocSwap
vmAllocExtend
spcAllocExtent
doAllocExt
spcAllocDataFileExt

申请空间:

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

如下:4是swap的表文件id

VM空间扩展

调用流程

spcAllocExtent
doExtendExt
spcExtendDatafile
dfExtend
dbExtendDevice
dbBuildDeviceBlocks
writeDevice
writeFile
write

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

【YashanDB知识库】swap空间使用超大报错的更多相关文章

  1. 问题:Linux报swap空间占用过高,但物理内存还有空余

    报错 收到报警,swap空间占用过高,登录到系统查看内存使用详情,看到物理内存还有很多未使用 问题分析 Swap配置对性能的影响分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错 ...

  2. 增加SWAP空间的方法

    增加swap空间的方法 背景:安装oracle数据库需要,需要设置swap空间为16G,当前swap空间只有4G,需要增加12Gswap空间. 1.创建一个空文件 # dd if=/dev/zero ...

  3. debian 中新建或调整 swap 空间

    调整 swap 空间之前,需要了解下面几个基本操作: 1. swap 空间是根据 /etc/fstab 中的记录挂载的 2. 可以使用 swapoff 临时关闭 swap 空间,同时可以使用 swap ...

  4. SWPFILE实现(增加swap空间)

    1.mkdir /var/swap chmod  700  /var/swap(可以不用设置) 2.dd if=/dev/zero of=/var/swap/file bs=1024 count=65 ...

  5. 查看修改swap空间大小

    1  查看swap 空间大小(总计):      # free -m          默认单位为k, -m 单位为M                total       used       fr ...

  6. Red Hat linux 如何增加swap空间

    按步骤介绍 Red Hat linux 如何增加swap空间 方法/步骤 第一步:确保系统中有足够的空间来用做swap交换空间,我使用的是KVM,准备在一个独立的文件系统中添加一个swap交换文件,在 ...

  7. Linux学习(十四)磁盘格式化、磁盘挂载、手动增加swap空间

    一.磁盘格式化 分好去的磁盘需要格式化之后才可以使用.磁盘分区一般用mke2fs命令或者mkfs.filesystemtype.这个filesystemtype分为ext4,ext3,xfs等等.xf ...

  8. gitlab pipelines job执行时日志较大报错

    问题描述 gitlab pipelines job执行时日志较大报错 Job's log exceeded limit of 4194304 bytes. 解决方案 出现该问题主要是因为gitlab ...

  9. linux swap空间的swappiness=0

    linux 会使用硬盘的一部分做为SWAP分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(acti ...

  10. 手动增加swap空间

           在日常工作中,swap没有必要搞那么大的空间,因为现在好多服务器都使用了ssd硬盘,这些硬盘还是比较贵的.如果服务器内存是128G,swap空间还设置成内存的两倍的话,那岂不是很明显是很 ...

随机推荐

  1. JavaSE 计算2个List集合中的交集、差集、并集、去重并集

    VideoOrder.java 重写里面的equals和hashCode方法 class VideoOrder { private int price; private String title; p ...

  2. Oracle 触发器 before insert update

    场景,往A表插入数据时,A表和B表是同一类型的状态下,A表中累计的值,不能超过B表中的值(注:往数据库插入时,不能批量执行事务!),利用触发器before insert update,监控状态,若超过 ...

  3. 安装和引入方式在Element UI (Vue 2)和Element Plus (Vue 3)中的不同

    安装和引入方式 Element UI (Vue 2): // main.js import Vue from 'vue'; import ElementUI from 'element-ui'; im ...

  4. 国赛2024 simple_php(三种方法)

    <?php ini_set('open_basedir', '/var/www/html/'); error_reporting(0); if(isset($_POST['cmd'])){ $c ...

  5. java面试一日一题:java内存模型

    问题:请讲下java内存模型? 分析:该问题比较容易和jvm内存区域(java内存结构)这样的问题混淆,其实他们是两个概念,jvm内存区域指的是运行时的几块数据区域,包括堆.方法区.虚拟机栈.本地方法 ...

  6. windows生成苹果私钥证书p12证书和profile文件的方法

    hbuilderx出现已经有差不多10年时间了,现在越来越多的企业,开始使用跨平台性更优秀的uniapp来开发ios app. 开发ios app的时候,打包需要苹果的私钥证书和证书profile文件 ...

  7. 使用Cython调用CUDA Kernel函数

    技术背景 前面写过一篇关于Cython和C语言混合编程的文章,在Cython中可以使用非常Pythonic的方法去调用C语言中的函数.另外我们也曾在文章中介绍过Python中使用CUDA计算的一种方案 ...

  8. 【Mybatis】11 注解的使用

    文档引用:http://www.mybatis.cn/archives/678.html 视频参考:https://www.bilibili.com/video/BV1NE411Q7Nx?p=15 注 ...

  9. 【Java-GUI】01 AWT & 布局

    https://www.bilibili.com/video/BV1Z54y1S7ns --1.AWT 完整描述:Abstract Window Toolkit 抽象窗口工具集 提供的API资源 抽象 ...

  10. AI实践者师生夏令营讲座视频:南京大学Lamda实验室(周志华 团队)讲座视频 —— 强化学习的局限性与展望

    视频地址: 周志华团队与Intel团队的讲座视频--强化学习的局限性与未来展望 视频链接地址: https://bizwebcast.smarket.com.cn/b975d6d9969a42cba9 ...