Doris报错:You can change the limit by session variable exec_mem_limit

本文档介绍了Doris查询时遇到的内存溢出错误,详细解析了错误信息,包括`Memory exceed limit`的含义。通过执行`show variables like 'exec_mem_limit'`命令,发现默认内存限制为2147483648字节。为解决此问题,使用`SET GLOBAL exec_mem_limit=8589934592`命令将内存限制提高到8GB,并说明需重启FE以使更改生效。这是一个关于数据库管理和性能优化的技术文章。

1. Doris查询时报以下错误,翻译以下应该是内存溢出

errCode = 2, detailMessage = Memory exceed limit. New partitioned Aggregation in spill Backend: ip, fragment: 19530b73ae33475a-9fd4089caca411c3 Used: 2525366160, Limit: -1. You can change the limit by session variable exec_mem_limit.

2. 执行下面命令查看 exec_mem_limit 内存是2147483648字节

show variables like "exec_mem_limit";

3.通过下面命令修改exec_mem_limit 内存

SET GLOBAL exec_mem_limit = 8589934592;


4.然后重启FE生效 

### 查询方法 在 Apache Doris 中,可以通过以下几种方式查询 `exec_mem_limit` 参数的当前值: 1. **查询当前会话的 `exec_mem_limit` 值** 使用以下 SQL 语句可以查看当前会话的 `exec_mem_limit` 设置: ```sql SHOW VARIABLES LIKE 'exec_mem_limit'; ``` 这条命令将显示当前会话的 `exec_mem_limit` 值,单位为字节[^3]。 2. **查询全局的 `exec_mem_limit` 值** 如果需要查看全局的 `exec_mem_limit` 设置,可以使用以下 SQL 语: ```sql SHOW GLOBAL VARIABLES LIKE 'exec_mem_limit'; ``` 这条命令会显示全局级别的 `exec_mem_limit` 值,单位为字节。 3. **通过 BE 节点的配置文件查看** `exec_mem_limit` 参数主要与 Doris 的 Backend (BE) 节点相关,因为它控制的是查询在 BE 节点上的内存使用。可以在 BE 节点的配置文件中查看默认值,但此参数通常是动态的,可以通过 SQL 语句进行调整[^2]。 4. **通过 FE 节点的配置文件查看** 虽然 `exec_mem_limit` 是一个可以在会话级别或全局级别设置的动态参数,但它的默认值可能在 FE 节点的配置文件中定义。可以通过查看 FE 节点的配置文件来了解默认值设置[^1]。 ### 参数的动态调整 `exec_mem_limit` 是一个动态参数,可以通过 SQL 语句进行调整,而无需重启 Doris 集群。以下是一些常见的调整方式: 1. **临时调整当前会话的 `exec_mem_limit` 值** 可以通过以下 SQL 语句临时调整当前会话的 `exec_mem_limit` 值,单位为字节: ```sql SET exec_mem_limit = 4294967296; -- 设置为4GB ``` 此设置仅对当前会话有效,会话结束后将恢复为默认值。 2. **永久调整全局的 `exec_mem_limit` 值** 如果需要永久调整全局的 `exec_mem_limit` 值,可以使用以下 SQL 语句: ```sql SET GLOBAL exec_mem_limit = 4294967296; -- 设置为4GB ``` 此设置将影响所有新建立的会话,但不会影响已经存在的会话[^3]。 ### 参数的限制关系 在实际使用中,`exec_mem_limit` 的值还受到 `statics_sql_mem_limit_in_bytes` 参数的限制。`statics_sql_mem_limit_in_bytes` 是一个系统级硬限制,所有查询都不能超过此内存上限。因此,实际查询可用内存为两者中的较小值: ```sql 实际查询可用内存 = MIN(statics_sql_mem_limit_in_bytes, exec_mem_limit) ``` 这意味着即使设置了较高的 `exec_mem_limit` 值,如果 `statics_sql_mem_limit_in_bytes` 的值较低,查询仍然会被限制在 `statics_sql_mem_limit_in_bytes` 的内存上限内[^4]。 ### 使用场景与调优建议 - **小规模查询** 对于简单的查询,较低的 `exec_mem_limit` 值可能是足够的,这有助于节省系统资源供其他查询或操作使用。 - **大规模复杂查询** 当执行复杂的聚合、连接或其他需要大量内存的操作时,适当提高 `exec_mem_limit` 可以显著提升查询性能。然而,这也意味着更多的内存将被单一查询占用,因此需要权衡考虑。 - **并发查询优化** 在高并发环境下,合理分配每个查询的内存限制非常重要。过高的 `exec_mem_limit` 设置可能导致多个同时运行的查询之间发生内存竞争,影响整体系统性能。 ### 示例 以下是一个完整的示例,展示如何查询和调整 `exec_mem_limit` 参数: ```sql -- 查询当前会话的 exec_mem_limit 值 SHOW VARIABLES LIKE 'exec_mem_limit'; -- 查询全局的 exec_mem_limit 值 SHOW GLOBAL VARIABLES LIKE 'exec_mem_limit'; -- 临时调整当前会话的 exec_mem_limit 值为4GB SET exec_mem_limit = 4294967296; -- 永久调整全局的 exec_mem_limit 值为4GB SET GLOBAL exec_mem_limit = 4294967296; -- 执行一个大查询 SELECT * FROM large_table JOIN ...; ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值