如何限制单条sql使用的最大内存

【 TiDB 使用环境】生产环境
【 TiDB 版本】 7.5.0

【遇到的问题:问题现象及影响】 你好,我想问一下,现在我们在跑sql的时候,会导致内存OOM,请问怎么限制单挑SQL的内存使用,或者限制超过多少内存的SQL的并发查询数

可以按用户来限制资源的使用,这个可能会更合理

参考下:
https://docs.pingcap.com/zh/tidb/stable/tidb-resource-control#使用资源管控-resource-control-实现资源隔离


社区还有专门的实践帖子,可以自行搜索

tidb_mem_quota_query 可以看下这个文档
https://docs.pingcap.com/zh/tidb/stable/configure-memory-usage#如何配置-tidb-server-实例使用内存的阈值

你找的是这个么?


https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_mem_quota_query

2 个赞

楼上正解

限制SQL内存使用是一方面,主要是问题SQL把TiDB Server进程搞死,要真正解决问题,还是得优化SQL

tidb_mem_quota_query控制整个会话的内存大小(包括会话中的所有sql占用的总内存量),超过后会触发 tidb_mem_oom_action 这个参数指定的操作。

image
以上是设置单条SQL的内存为4G,你可以根据自己的情况调整数值

如设置单个SQL的最大使用内存为1GB,可以使用如下两种方法
方法一:set session tidb_mem_quato_query=1 << 30; (会话级,也可以设置为全局,session改成 global)
方法二:select /*+ MEMORY_QUOTA(1024) */ from test;

SET SESSION tidb_mem_quota_query = <memory_limit>;

1 个赞

tidb_mem_quota_query

tidb_mem_quota_query

tidb_mem_quota_query

楼主问的是限制单条SQL的内存,如果仅仅是这个问题的话,那么其他大佬提到的 tidb_mem_quato_query 参数就可以限制一条SQL的最大使用内存,当超过的时候sql会直接被干掉,并返回报错信息。

但按楼主的题干描述,需要的其实是解决OOM的问题。那么目标就转化为要解决或者是缓解OOM的情况,那么楼主可以有下面的处理措施:

1.在数据库侧

  • 在数据库服务端配置oom-action 为cancel
  • 限制整个tidb-server 的内存使用
  • 还可以开启大SQL执行超过内存使用时的落盘功能,设置好相关磁盘目录

2.在业务侧

  • 和开发一起优化SQL,一定要尽量避免大量读取数据占用过多内存
  • 控制并发

顺着这些思路处理和执行,如果能落实下来,楼主的问题应该就可以大大缓解了。

2 个赞

tidb_mem_quota_query

如果解决了,记得标注一下正确答案。

1 个赞

使用系统变量 tidb_mem_quota_query 来配置一条 SQL 执行过程中的内存使用阈值,单位为字节。

tidb_mem_quota_query

OOM是整个数据库被杀掉还是这个连接会被杀掉

学习打卡 :melting_face: