单SQL语句导致Hana内存溢出警告
1. S4-HANA系统突发卡滞2. DB02确认HANA内存耗用3.Hana studio 查询系统日志4.Hana studio 查询耗用较大的语句,找到异常语句5.分析语句异常原因6.对策1:优化SQL,降低运行时耗用内存7.对策2:优化Hana参数,对单SQL语句执行限制最大内存7.1 打开HANA内存资源追踪7.2 设置单语句内存限制
8. 参考资料SAP帮助文档,设置SQL内存限制
1. S4-HANA系统突发卡滞
某日SAP系统突发卡滞,用户反馈事物无法执行,大量接口访问失败。系统版本,S4HANA1809。
2. DB02确认HANA内存耗用
SAP GUI/事务码DB02查询HANA数据库内存耗用,发现对应时间点2021/04/30日9点前出现突然内存耗用达到90%以上,与发生时间吻合(前1天也发生过1次)。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ee8aef904ff04c76974b08285511cbcd.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIQU9KVU5DSEFPMTk4NQ==,size_16,color_FFFFFF,t_70)
3.Hana studio 查询系统日志
发现8点55分出现一次alert警告,但从该警告内部仅知道发生内存溢出,未找到出错的语句。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e6be586701064fd1b5936985deaa3ba8.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIQU9KVU5DSEFPMTk4NQ==,size_16,color_FFFFFF,t_70)
4.Hana studio 查询耗用较大的语句,找到异常语句
前提,Hana-studio中开启了耗用大的语句追踪 此处我们设置的暂时是30秒以上 在HANA-STUDIO中,使用SQL如下,注:此处仅查询出错的语句 ERROR > 0 ,否则会把所有耗时语句都找出来,稍微难找一些。
SELECT
"HOST",
"PORT",
"CONNECTION_ID",
"TRANSACTION_ID",
"STATEMENT_ID",
"DB_USER",
"APP_USER",
"START_TIME",
"DURATION_MICROSEC",
"OBJECT_NAME",
"OPERATION",
"RECORDS",
"STATEMENT_STRING",
"PARAMETERS",
"ERROR_CODE",
"ERROR_TEXT",
"LOCK_WAIT_COUNT",
"LOCK_WAIT_DURATION",
"ALLOC_MEM_SIZE_ROWSTORE",
"ALLOC_MEM_SIZE_COLSTORE",
"MEMORY_SIZE",
"REUSED_MEMORY_SIZE",
"CPU_TIME"
FROM "PUBLIC"."M_EXPENSIVE_STATEMENTS"
WHERE ERROR_CODE > 0
ORDER BY START_TIME DESC;
发现8:48分,有一条语句因为内存耗用过大,失败,执行时长406秒,该语句在29日下午16点43分也执行过一次,与DB02监控中记录吻合 有问题的语句如下,该语句使用MSEG表2次关联,此次查询未输入日期范围:
select
a1.MATNR,
a3.MAKTX,
a1.CHARG, --批次
to_char(A1.BUDAT_MKPF,'yyyy-MM-dd') as indateymd,--批次对应入库日期
a1.MENGE as pcmenge,---批次对应入库数量
a2.BWART,
a2.LIFNR,---供方
a2.MENGE,
a2.MBLNR
from H4P.saphanadb.NSDM_V_MSEG a1
left join H4P.saphanadb.NSDM_V_MSEG a2 on a1.CHARG=a2.CHARG and a1.MATNR=a2.MATNR and a2.BWART!='101'
left join H4P.saphanadb.MAKT a3 on a1.MATNR=a3.MATNR and a1.mandt=a3.mandt
where a1.mandt=800
and a1.BWART='101'
and length(a1.matnr)>1
and 1=1 ${if(len(MATNR)==0,"","and a1.MATNR like '%"+MATNR+"%'")}
and 1=1 ${if(len(CHARG)==0,"","and a1.CHARG like '%"+CHARG+"%'")}
order by a1.MATNR,a1.BUDAT_MKPF,a2.BUDAT_MKPF
5.分析语句异常原因
在测试环境还原,确认该语句Join后的条数巨大,执行过程中占用的内存肯定会非常大。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1c52868f1e8c42f8be15b26289b9dbb4.png)
6.对策1:优化SQL,降低运行时耗用内存
通过限制取数范围,补充缺少的join条件等。
7.对策2:优化Hana参数,对单SQL语句执行限制最大内存
7.1 打开HANA内存资源追踪
Hana-studio 配置参数,打开内存资源追踪 2个参数 enable_tracking/memory_tracking 为on状态 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f7255a26a0f1467f9fe4624644bc04bc.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIQU9KVU5DSEFPMTk4NQ==,size_16,color_FFFFFF,t_70)
7.2 设置单语句内存限制
有如下3个相关参数: statement_memory_Limit 限制单个SQL最大执行内存,根据公司数据量/程序现状设置,保障系统和正常业务能够执行,此处我们设置150G statement_memory_Limit_threshold 启用单语句限制的门槛,为百分比,即当系统实时耗用内存占比达到这个比例时,才启用单语句内存限制 total_statement_memory_limit,限制所有SQL使用的总内存,此处我们暂时没有用 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8332d6d4d4c34bba829ddeb166e6e1f6.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIQU9KVU5DSEFPMTk4NQ==,size_16,color_FFFFFF,t_70)
8. 参考资料
SAP帮助文档,设置SQL内存限制
Setting a Memory Limit for SQL Statements
|