本文介绍 OceanBase 数据库中问题 SQL 限流到 0 后 CPU 使用率未降低的原因和解决方法。
问题描述
在 OceanBase 数据库中,当出现一个问题 SQL 导致 CPU 使用率超限的场景时,将该问题 SQL 限流为 0 后,仍然出现高 CPU 使用率的情况。
适用版本
OceanBase 数据库 V2.x 和 V3.x版本。
问题原因
问题出现在限流操作中,由于该问题 SQL 限流为 0 会导致 SQL 匹配计划时报错,因此每次获取计划都会直接报错。这样每次获取计划都会失败,就会认为没有获取到计划,需要重新生成计划。这导致每次 SQL 进来都会进行硬解析,从而导致 CPU 使用率很高。
解决方法
OceanBase 数据库中采用 outline 绑定到 SQL 上实现 SQL 的限流,通过 HINT 索引 /*+max_concurrent(1)*/ 将该问题 SQL 限流限制规则设置为 1。
示例如下。
obclient> ALTER OUTLINE o1_1 ADD SELECT /*+max_concurrent(1)*/ * FROM t1 WHERE c1 = 1 and c2 = ?;
有关 outline 实现 SQL 的限流更多内容可参考 ALTER OUTLINE。