SAP HANA SQL语句内存使用限制策略

为了保证系统资源使用的公平性,避免单一进程耗尽系统资源,保证系统稳定、持续可用,对HANA资源的使用做限制。

理论知识

By default , single SAP HANA query can consume 100% of available memory. If you want to safeguard your system from uncontrolled expensive queries then it’s a good idea to limit the memory consumption of single statement per host.

Starting HANA SP08 SAP introduced parameter statement_memory_limit to restrict the query at predefined memory consumption limit.

Queries will be aborted with OOM dump (“compositelimit_oom OR [MEMORY_LIMIT_VIOLATION] “) ,  if it reaches the limit specified by this parameter – statement_memory_limit .

Requirement: You want to limit query from consuming limitless HANA memory.

Prerequisite:  You need database user with INIFILE ADMIN system privilege assigned.You also need statement memory tracking feature enabled. You need to change following parameters , these parameters do not need restart.

global.ini > [resource_tracking] > enable_tracking = on

global.ini > [resource_tracking] > memory_tracking = on

This will populate the MEMORY_SIZE column of expensive statement trace( M_EXPENSIVE_STATEMENTS)

Step:

  • Connect to HANA system and open SQL console in HANA studio
  • Execute following SQL

alter system alter configuration (‘global.ini’,’SYSTEM’) SET (‘memorymanager’, ‘statement_memory_limit’) = 100 with reconfigure;

// This SQL will set the limit to 100 GB.

OR change following parameter.

Administration perspective > Configuration > global.ini  > [memorymanager] -> statement_memory_limit = <maximum_memory_allocation_in_gb>

SAP HANA statement_memory_limit

If you want to disable this parameter , simply remove the parameter.

Starting SP09 we got flexibility this parameter in accordance of percentage of global allocation limit. Below parameter  make sure that the statement_memory_limit only takes effect if the overall SAP HANA memory allocation exceeds a defined percentage of the global allocation limit:

global.ini > [memorymanager] > statement_memory_limit_threshold = <percentage_of_global_allocation_limit>

具体设置记录

https://help.sap.com/viewer/bed8c14f9f024763b0777aa72b5436f6/2.0.03/en-US/7b3e645df1d044cead4d208ed62e8ef7.html

SAP HANA SQL语句内存使用限制策略

SAP HANA SQL语句内存使用限制策略

以上参数设置的基本逻辑:

单个SQL最大允许查询100GB数据,所有SQL查询的数据最大为1000G,留下400GB给表LOAD,这样就能保证系统很快,又能有效防止由于某个查询导致整个内存中的表UNLOAD的现象。

配置调整:

发现刚开始LOAD数据时,单个进程会需要很多内存,以上设置会导致LOAD表DUMP,因此改为以下配置:

SAP HANA SQL语句内存使用限制策略

当某个查询达到限制的值时,将会自动DUMP,HANA内存将会自动释放,ST22显示如下:

SAP HANA SQL语句内存使用限制策略

此时,数据库还是健康的,其他的人操作也没有任何影响,只是杀死了这个用户当前的这个操作,保证系统资源使用的公平性以及系统的安全。

其实一个正常的SQL一般也不太可能占用100GB的内存,当真的占用这么大的内存时,首先应该分析代码是不是有bug、是不是有不符合规则的数据触发了类似cross union之类的问题。

其他参数调整:

tables_preloaded_in_parallel

每次重启HANA或者HANA发生UNLOAD之后系统都会重新加载数据到内存中。调整加载表到内存中的并发进程数,改成10,加快加载表的速度,使系统在故障后能尽快恢复快速响应的状态。

SAP HANA SQL语句内存使用限制策略

 

如若转载,请注明出处:https://www.gavindong.com/5720.html

微信沟通