泽非
#1
【 使用环境 】生产环境
【 OB or 其他组件 】3个observer,2个obproxy, 3个obagent,1个ocp-express
【 使用版本 】V4.2.2_CE
【问题描述】oceanbase大sql性能兼容性问题, 最近准备迁移oceanbase,但是突然测出几个老的大报表SQL在mysql8上6秒,在polardb上2秒,在oceanbase上300秒也出不来
期待 在处理这种大sql上性能 接近普通mysql,或者慢2-3倍也行,但是出不来不行。
【复现路径】执行附件里的问题sql
【附件及日志】bigreport.sql 和对应的查询计划
bigsql_ob_explain.txt (191.2 KB)
bigreport.sql.txt (58.7 KB)
洪波
#3
select /*+ parallel(32) */ count(1),先加下并行试下
泽非
#4
加了 112秒可以出来,执行的时候只有一台observer cpu200% 利用还有问题, 租户16核32GB
[13:36:08]DB Permission Check(14 us)
[13:36:08]External SQL interception(9 us)
[13:36:08]SQL Console Rule Check(7 us)
[13:36:08]SQL Check(6 us)
[13:36:08]Jdbc prepare(1 ms)
[13:36:08]Network consumption(1.85 ms)
[13:36:08]OBServer wait(1.53 s)
[13:36:10]DB Server Execute SQL(102.99 s)
[13:37:53]Calculate duration(162.64 ms)
[13:37:53]Get result-set(27.93 ms)
-
[13:37:54]获取 SQL 类型(16.49 ms)
-
[13:37:54]获取可编辑信息(55 us)
-
[13:37:54]获取列信息(23.62 ms)
-
[13:37:54]获取告警内容(6 us)
-
[13:37:54]SQL 后置检查(165 us)
[13:37:54]SQL Console Rule Check(14 us)
[13:37:54]Set Nls Format(37 us)
[13:37:54]Data Masking(94 us)
治民
#5
从执行计划看,这些SQL相关的表明显在不同的observer上,建议将这些表放到同一个tablegroup 或者 修改租户的zone的优先级到同一Zone下
泽非
#6
已经是优先了,
我看看怎么把表放到一个tablegroup
治民
#7
不是的,可以参考如下说明。
当 Primary Zone 列表包含多个 Zone 时,用 ;
分隔的具有从高到底的优先级;,
分隔的具有相同优先级。例如:'hz1,hz2;sh1,sh2;sz1'
表示 hz1
和 hz2
具有相同的优先级,并且优先级高于 sh1
/sh2
和 sz1
;sh1
和 sh2
具有相同优先级,并且优先级高于 sz1
。
泽非
#8
现在是租户副本型 在zone1 和zone2 上,现在就使用逗号, 分隔就是相同优先级了嘛
治民
#9
是的,目前zone1 & Zone2的优先级是一样的。
如下是Zone1优化级别高的例子
泽非
#10
我们测试将逗号改为 分号,就是zone1 在zone2 前面,并行度32 情况下,2秒多可以出来,cpu耗用在300%多左右
非常感谢!!
泽非
#11
bigsql_ob_explain_parallel32.txt (268.3 KB)
这个是zone1 优先,zone2 次之下的,查询计划,这个是哪个细节显示的在不同的observer上?
治民
#12
Zone1优先,Zone2次之 这样的策略本身就是所有表的leader都在Zone1上,按1-1-1的部署架构,所有表的leader都在同一个observer上。即我们当前并未使用到OceanBase的分布式能力,仅使用到了高可用能力。在表内数据比较大的情况下,可以将表改造成分区表,从而使用到OceanBase的分布式能力。
泽非
#13
嗯嗯 ,非常感谢解惑
另外 想问问下, 这个查询计划怎么阅读 有更多的相关资料么?您是怎么一眼看出开始的执行计划 是在多个observer上执行的?
洪波
#14
执行计划由一系列的文章,感兴趣可以看看:OceanBase 社区