DWS的内存保护机制会在我们使用的内存达到参数设置的上限的时候产生报错提示:memory is temporarily unavailable,这是为了避免我们执行作业的时候,使用的内存过多时可能会造成操作系统级别的OOM,导致数据库进程被OS强行kill掉。

举个例子:

可以查询内存视图:pv_total_memory_detail;
image.png

如图:我们可以使用的用来执行语句的内存上限,为图中的max_dynamic_memory,使用过的最大的内存为图中的dynamic_peak_memory,上图中,peak_memory达到了26062,超过了限制的26028,就会触发数据库级别的内存限制报错:memory is temporarily unavailable。

此类情况出现的原因很多,大部分是由于SQL语句执行的过程中,申请的内存比较多导致的,可以在报错时,看下数据库的cn日志中,有无如下内容:

image.png

比如该日志内容,可以看到该语句线程中,使用内存达到22.8G。但是实际上该库中最多内存只有26G左右,因此就会出现内存不足的问题。

【解决问题】

此类情况可以对语句中涉及到的表做analyze,当太久不analyze时,会出现统计信息差距过大,导致执行计划和内存估算出现很大的不准的情况。

做analyze之后可以矫正内存估算情况,避免该语句申请内存过大导致内存超限报错。