OB 4.2.1.6版本,update语句磁盘读写异常

【 使用环境 】生产环境
【 OB or 其他组件 】Oceanbase
【 使用版本 】4.2.1.6
【问题描述】使用update语句更新ob表,显示磁盘繁忙,proxy节点的磁盘繁忙(90% -100%),server正常波动,并且proxy节点cpu飙高
【SQL语句】update tableA set a = xx , b = xx where c = xx and d = xx and a != xx and a != xx and e = xx; , 其中b c d e是主键,b d有自己的索引,c和其他字段有联合索引(其他字段该sql只有d,其他字段没有),xx为传入的值
【备注】我尝试用force index走 d 或者f的索引,没有效果改善,而且很奇怪的一点是为什么server没有显示磁盘繁忙或者是cpu飙高,proxy节点会高

这个是我的执行计划

没有走索引

  1. 针对你obproxy节点为什么磁盘使用率接近100%的问题:
    可以使用iotop和pidstat工具,找出是什么进程占用大量IO, 然后进一步分析处理。

  2. 针对全表扫描的问题:
    (1). 语法不支持 USE INDEXFORCE INDEX.
    (2).你这个SQL语句,关键要看哪个字段的过滤性比较强,在过滤性强的字段上创建索引。在where条件中,只有c,d,e三个有效字段,可以参考这三个字段创建组合索引。

感谢大佬回答,关于1 我这边使用了pidstat 查看在update过程中IO比较大的进程发现是obproxy,和监控看到的磁盘繁忙一致。


关于2 这个不支持index是指update语法不支持还是如果走全表扫描不支持呢,我这边尝试添加了force index(b)以及d,发现并没有解决问题,关于是否要将where条件全部做成索引,由于表本身的限制可能无法再新增联合索引了。烦请大佬再帮忙查看一下

改成查询语句看下执行计划呢

这个是同where查询条件下select语句的执行计划

  1. 针对obproxy进程占用大量IO的问题:
    使用strace命令跟踪obproxy进程。 例如:strace -p …, 看看该进程的IO涉及哪些文件。
    怀疑是不是proxyconfig配置项中slow相关的参数值设置太低,导致慢SQL写入obproxy_slow.log等文件中了?show proxyconfig like ‘%slow%’;

  2. oceanbase不支持force index语法。 如下摘要来看官方文档。
    “ 语法支持 INDEX Hint、FULL Hint、ORDERED Hint 和 LEADING Hint 等,不支持 USE INDEXFORCE INDEX 。”

从你发出的执行计划来看,执行算子是“table range scan”, 这应该是通过主键进行范围扫描了。你发出的执行计划不全。

1 个赞

其他字段位置是在哪里,是在c和d之间吗,如果在中间只有c能生效了,看下c的过滤出来数据比例是多少呢,太低可能走不上,如果能过滤出来很少数据,看下统计信息,收集下统计信息再试试呢

1 个赞

感谢 刚刚通过查询发现obproxy日志打印量比较大,将info打印关闭后,磁盘繁忙恢复正常了

DML 语句编写规范

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000820841