工作区内存不足,错误代码 4013时要怎么处理?

在执行 UNION、SORT 或 GROUP BY 查询时报 4013 错误,提示工作区内存不足。本文介绍该问题的解决方法。

适用版本

OceanBase 数据库 1.4.X 版本。

问题现象

在执行 UNION、SORT 或 GROUP BY 查询时报错,错误信息如下。

obclient> SELECT * FROM <table_name> GROUP BY <column_name>; ERROR 4013(HY001): No memory or reach tenant memory limit

可能原因

工作区内存的限制为

租户内存 * ob_sql_work_area_percentage

,其中

ob_sql_work_area_percentage

用于配置租户执行 SQL 使用内存百分比限制,默认为 5,取值范围为 0 ~ 100。有关该系统变量的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统变量 **章节。

如果请求并发量较大,且每个请求占用的工作区内存比较多,可能出现工作区内存不足的错误。对于大数据量的操作,OceanBase 数据库 V1.4.X 版本没有及时将内存 dump 到磁盘,而是全部缓存在工作区,因此并发量大的场景下,很容易出现不足。

OceanBase 数据库 V2.X 版本将非必须的内存从工作区转移到 Default Ctx 进行统计,并将执行结果 dump 到磁盘(默认为100 MB),从而大大降低了该问题出现的概率。

解决方式

可以通过调大工作区内存系统变量来规避,将系统变量

ob_sql_work_area_percentage

设置为 10 或者更大。

obclient> SET GLOBAL ob_sql_work_area_percentage=10;