oceanbase大sql性能兼容性问题,准备迁移oceanbase,但是突然测出几个老的遗漏大报表SQL在mysql8上6秒,在polardb上2秒,在oceanbase上300秒也出不来

【 使用环境 】生产环境
【 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)

select /*+ parallel(32) */ count(1),先加下并行试下

加了 112秒可以出来,执行的时候只有一台observer cpu200% 利用还有问题, 租户16核32GB

  • [13:36:01]ODC 解析 SQL(7.39 s)

  • [13:36:08]SQL 预检查(59 us)

[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]执行(104.72 s)

[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)

  • 完成(总耗时:112.84 s)

从执行计划看,这些SQL相关的表明显在不同的observer上,建议将这些表放到同一个tablegroup 或者 修改租户的zone的优先级到同一Zone下

已经是优先了,
我看看怎么把表放到一个tablegroup

不是的,可以参考如下说明。
当 Primary Zone 列表包含多个 Zone 时,用 ; 分隔的具有从高到底的优先级;, 分隔的具有相同优先级。例如:'hz1,hz2;sh1,sh2;sz1' 表示 hz1hz2 具有相同的优先级,并且优先级高于 sh1 /sh2sz1sh1sh2 具有相同优先级,并且优先级高于 sz1

现在是租户副本型 在zone1 和zone2 上,现在就使用逗号, 分隔就是相同优先级了嘛

是的,目前zone1 & Zone2的优先级是一样的。
如下是Zone1优化级别高的例子

我们测试将逗号改为 分号,就是zone1 在zone2 前面,并行度32 情况下,2秒多可以出来,cpu耗用在300%多左右

非常感谢!!

bigsql_ob_explain_parallel32.txt (268.3 KB)

这个是zone1 优先,zone2 次之下的,查询计划,这个是哪个细节显示的在不同的observer上?

Zone1优先,Zone2次之 这样的策略本身就是所有表的leader都在Zone1上,按1-1-1的部署架构,所有表的leader都在同一个observer上。即我们当前并未使用到OceanBase的分布式能力,仅使用到了高可用能力。在表内数据比较大的情况下,可以将表改造成分区表,从而使用到OceanBase的分布式能力。

嗯嗯 ,非常感谢解惑

另外 想问问下, 这个查询计划怎么阅读 有更多的相关资料么?您是怎么一眼看出开始的执行计划 是在多个observer上执行的?

执行计划由一系列的文章,感兴趣可以看看:OceanBase 社区