SAP单SQL语句导致Hana内存溢出警告
单SQL语句导致Hana内存溢出警告
1. S4-HANA系统突发卡滞
某日SAP系统突发卡滞,用户反馈事物无法执行,大量接口访问失败。系统版本,S4HANA1809。
2. DB02确认HANA内存耗用
SAP GUI/事务码DB02查询HANA数据库内存耗用,发现对应时间点2021/04/30日9点前出现突然内存耗用达到90%以上,与发生时间吻合(前1天也发生过1次)。
3.Hana studio 查询系统日志
发现8点55分出现一次alert警告,但从该警告内部仅知道发生内存溢出,未找到出错的语句。
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后的条数巨大,执行过程中占用的内存肯定会非常大。
6.对策1:优化SQL,降低运行时耗用内存
通过限制取数范围,补充缺少的join条件等。
7.对策2:优化Hana参数,对单SQL语句执行限制最大内存
7.1 打开HANA内存资源追踪
Hana-studio 配置参数,打开内存资源追踪
2个参数 enable_tracking/memory_tracking 为on状态
7.2 设置单语句内存限制
有如下3个相关参数:
statement_memory_Limit 限制单个SQL最大执行内存,根据公司数据量/程序现状设置,保障系统和正常业务能够执行,此处我们设置150G
statement_memory_Limit_threshold 启用单语句限制的门槛,为百分比,即当系统实时耗用内存占比达到这个比例时,才启用单语句内存限制
total_statement_memory_limit,限制所有SQL使用的总内存,此处我们暂时没有用
8. 参考资料
SAP帮助文档,设置SQL内存限制
Setting a Memory Limit for SQL Statements
文章来自于网络,如果侵犯了您的权益,请联系站长删除!