doris查询报错err: Error 1105: errCode = 2, detailMessage = Memory limit exceeded:<consuming tracker:...

查询报错信息显示如下

err: Error 1105: errCode = 2, detailMessage = Memory limit exceeded:<consuming tracker:<Query#Id=803945612dab4026-9a62e0f1775ffa37>, failed alloc size 0, exceeded tracker:<Query#Id=803945612dab4026-9a62e0f1775ffa37>, limit 2.00 GB, peak used 12.03 GB, current used 12.03 GB>, executing msg:<exec node:<ExecNode:VSORT_NODE (id=18)>, vsort, while sorting input.>. backend 192.168.30.116 process memory used 59.63 GB, limit 200.00 GB. If query tracker exceed, `set exec_mem_limit=8G` to change limit, details see be.INFO.

解决方法

为了防止用户的一个查询可能因为消耗内存过大。查询进行了内存控制,一个查询任务,在单个 BE 节点上默认使用不超过 2GB 内存。

用户在使用时,如果发现报 Memory limit exceeded 错误,一般是超过内存限制了。

遇到内存超限时,用户应该尽量通过优化自己的 sql 语句来解决。

如果确切发现2GB内存不能满足,可以手动设置内存参数。

显示查询内存限制:

mysql> SHOW VARIABLES LIKE "%mem_limit%";
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| exec_mem_limit| 2147483648 |
+---------------+------------+
1 row in set (0.00 sec)

exec_mem_limit 的单位是 byte,可以通过 SET 命令改变 exec_mem_limit 的值。如改为 8GB。

mysql> SET exec_mem_limit = 8589934592;   #只是针对本次的查询修改,全局加上global
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE "%mem_limit%";
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| exec_mem_limit| 8589934592 |
+---------------+------------+
1 row in set (0.00 sec)

(1)以上该修改为 session 级别,仅在当前连接 session 内有效。断开重连则会变回默认值。
(2)如果需要修改全局变量,可以这样设置:SET GLOBAL exec_mem_limit = 8589934592;。设置完成后,断开 session 重新登录,参数将永久生效。