SQL查询优化

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.8
  • 【问题描述】:
    查询SQL

SELECT log.result_code, count(*)
FROM merchant_log log
WHERE log.id between 2008010000000000000 and 2008012359599999999
AND log.service_name = ‘b’
AND log.merchant_id = ‘a’
GROUP BY log.result_code;

表merchant_log中数据1.3亿

表结构如下

执行计划如下

在执行的时候,整个系统的SQL执行时间会飙升

请问下这个SQL可以再优化吗,或者执行SQL的时候,不影响系统的其他SQL执行

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

SELECT  /*+ STREAM_AGG() */
log.result_code, count(*)
FROM merchant_log log
WHERE log.id between 2008010000000000000 and 2008012359599999999
AND log.service_name = ‘b’
AND log.merchant_id = ‘a’
GROUP BY log.result_code;

试下

这个是执行计划的结果

我们的系统对数据库响应要求很高,超过1秒就有告警,所以不敢随便尝试。
请问下加上强制的作用是什么呢

我查询到这个参数的用途是优化聚合函数,让其使用更少的内存,但是实际上TIKV服务器在SQL执行时间长的那个时间点内存使用率基本上没有变化,只是CPU突然飙升


/*+ STREAM_AGG() */
3.0 版本还不支持,sorry

coprocessor cpu 上涨是预期的。服务器 cpu 上涨看着不是很明显,但是 load 确实升高了。

辛苦确认以下几点。

  1. 看下 merchant_log 的健康度
  2. 看下此 sql 查询数据范围是多大。
  3. 监控中的图是真实执行了这个 sql 吗。并且可以断定只执行了这个 sql 吗。
  4. 再帮忙确认下 16:00 时间,所有 tikv 的负载是否均衡,因为 212 的 coprocessor cpu 比其他要高很多。

1、健康度如下
image
2、这个SQL查询一天的数据量,范围数据估计100W左右。
3、监控图中,就是执行了这个SQL影响的,这个可以确定,同时是有其他SQL在运行,但是执行了这个SQL后,系统就异常了,因为是人为执行,也出现过很多次了,所以比较确定。
4、16点的时候,load负载都比较低的

tikv-details --> coprocessor detail 中的监控项能麻烦截图看下吗

主要看下 wait duration 和 scan duration

数据截图

看 coprocessor,212 的机器 cpu 是 60%,另2台是 20%。尝试切分下 region 能解决问题

这个表的region如何切分呢,目前整个系统有9W的region,已经是比较多了吧

asktug 搜索下 region merge ,目前看 region health - empty region 比较多。

切分 region,可以等上面的操作完成,看下结果再说,