【 使用环境 】生产环境
【 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节点会高
没有走索引
-
针对你obproxy节点为什么磁盘使用率接近100%的问题:
可以使用iotop和pidstat工具,找出是什么进程占用大量IO, 然后进一步分析处理。 -
针对全表扫描的问题:
(1). 语法不支持USE INDEX
和FORCE INDEX
.
(2).你这个SQL语句,关键要看哪个字段的过滤性比较强,在过滤性强的字段上创建索引。在where条件中,只有c,d,e三个有效字段,可以参考这三个字段创建组合索引。
感谢大佬回答,关于1 我这边使用了pidstat 查看在update过程中IO比较大的进程发现是obproxy,和监控看到的磁盘繁忙一致。
关于2 这个不支持index是指update语法不支持还是如果走全表扫描不支持呢,我这边尝试添加了force index(b)以及d,发现并没有解决问题,关于是否要将where条件全部做成索引,由于表本身的限制可能无法再新增联合索引了。烦请大佬再帮忙查看一下
改成查询语句看下执行计划呢
-
针对obproxy进程占用大量IO的问题:
使用strace命令跟踪obproxy进程。 例如:strace -p …, 看看该进程的IO涉及哪些文件。
怀疑是不是proxyconfig配置项中slow相关的参数值设置太低,导致慢SQL写入obproxy_slow.log等文件中了?show proxyconfig like ‘%slow%’; -
oceanbase不支持force index语法。 如下摘要来看官方文档。
“ 语法支持INDEX
Hint、FULL
Hint、ORDERED
Hint 和LEADING
Hint 等,不支持USE INDEX
和FORCE INDEX
。”
从你发出的执行计划来看,执行算子是“table range scan”, 这应该是通过主键进行范围扫描了。你发出的执行计划不全。
其他字段位置是在哪里,是在c和d之间吗,如果在中间只有c能生效了,看下c的过滤出来数据比例是多少呢,太低可能走不上,如果能过滤出来很少数据,看下统计信息,收集下统计信息再试试呢
感谢 刚刚通过查询发现obproxy日志打印量比较大,将info打印关闭后,磁盘繁忙恢复正常了