设置 单条 SQL 语句可以占用的最大内存阈值,并发时还有超出阈值的 SQL 执行成功

【TiDB 版本】:

3.0.11

###【问题描述】

设置 单条 SQL 语句可以占用的最大内存阈值,并发时还有超出阈值的 SQL 执行成功

内存已经限制了1G 但是从慢SQL中还是可以看到,耗费内存非常大的SQL执行成功了

SELECT
  DATE_FORMAT( Time, '%Y年 %m月 %d日 %H:%i' ) AS '发生日期',
  CONCAT( Query_time, '(秒)' ) AS '执行这个语句花费的时间',
  DB AS 'DB',
  CONCAT( Process_time, '(秒)' ) AS 'SQL在TiKV的 处理时间之和',
  CONCAT( Wait_time, '(秒)' ) AS 'SQL在TiKV的 等待时间之和',
  Mem_max / 1024 / 1024 AS 'sql 使用的内存(MB)'
FROM
  information_schema.`slow_query`
WHERE
  `is_internal` = FALSE
  AND DB != ''
  AND time > DATE_SUB( NOW( ), INTERVAL 1 HOUR )

ORDER BY
`Mem_max` DESC,
  `time` DESC,
  `query_time` DESC
  LIMIT 6;


SELECT  @@tidb_mem_quota_query;
+------------------------+------------------------+-------------+--------------------------+--------------------------+----------------------+
| 发生日期               | 执行这个语句花费的时间 | DB          | SQL在TiKV的 处理时间之和 | SQL在TiKV的 等待时间之和 | sql 使用的内存(MB) |
+------------------------+------------------------+-------------+--------------------------+--------------------------+----------------------+
| 2020年 04月 09日 18:20 | 116.107092117(秒)      | prd | 178.097(秒)              | 516.197(秒)              | 7731.86313534        |
| 2020年 04月 09日 18:18 | 102.784221652(秒)      | prd | 175.59(秒)               | 614.41(秒)               | 6946.97322750        |
| 2020年 04月 09日 17:31 | 101.107082278(秒)      | prd | 16.05(秒)                | 44.459(秒)               | 6409.95803452        |
| 2020年 04月 09日 18:16 | 77.432291534(秒)       | prd | 168.739(秒)              | 521.892(秒)              | 6247.95002842        |
| 2020年 04月 09日 18:15 | 58.694526321(秒)       | prd | 157.47(秒)               | 664.316(秒)              | 5724.31919003        |
| 2020年 04月 09日 18:14 | 51.395296538(秒)       | prd | 147.136(秒)              | 629.968(秒)              | 4984.60651779        |
+------------------------+------------------------+-------------+--------------------------+--------------------------+----------------------+

6 rows in set
Time: 3.632s

+------------------------+
| @@tidb_mem_quota_query |
+------------------------+
| 1073741824             |
+------------------------+
1 row in set
Time: 0.014s

由于内存的判断是在 TiDB 层,TiKV 返回给 TiDB 是一个一个 batch 的返回的,所以如果下推的计算并且返回结果很多的话,每次算子调用 Next() 才会更新统计使用的内存,这样才有机会干掉超过 tidb_mem_quota_query 的 SQL 。另外还需要确认一下这边 oom-action 的值。如果只是 log 的话是不会干掉的。