SQL在系统跑越来越慢,但是,正常跑又很快

【 使用环境 】测试环境
【 OB or 其他组件 】Oceanbase 4.4.1
【 使用版本 】4.4.1
【问题描述】
老师,您好,

我们在线上测试系统遇到个挺奇怪的事情:
问题SQL:

select r.id_ AS id, r.kh_khxx_id_ AS khKhxxId, r.foreign_id_ AS foreignId, r.type_ AS type,
        r.infra_user_wxid_ AS infraUserWxid,r.is_main_ AS isMain,r.wxid_ AS wxid,
        r.create_user_ AS createUser, r.create_date_ AS createDate
        from ftsp_wechat_kh_relation r
        left join crm_kh_qzkh_private p on r.kh_khxx_id_ = p.qzkh_id
        where r.type_ = 1 and p.emp_id = 'h0000000000000279529591864500224';

这个SQL我们在ODC上执行是很快的:

执行计划很很简单:

===============================================================================================================================
|ID|OPERATOR          |NAME                            |EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|
-------------------------------------------------------------------------------------------------------------------------------
|0 |NESTED-LOOP JOIN  |                                |6508    |159489      |910      |166758       |0          |14401       |
|1 |├─TABLE RANGE SCAN|p(idx_crm_kh_qzkh_private_19)   |5098    |108         |5098     |110165       |0          |1442        |
|2 |└─TABLE RANGE SCAN|r(idx_ftsp_wechat_kh_relation_1)|1       |31          |910      |166758       |0          |150322      |
===============================================================================================================================

但是,放在线上跑,却感觉有点奇怪:
1、OCP监控,这个SQL的整体耗时很高。

从SQL采样中,拿>1s的SQL去ODC上跑,执行时间都很快的~

2、我们将>200ms的SQL,抓取到 es 上,通过kibana分析,

我们也发现,这个SQL的执行时间确实是增加,

有点不明白为什么这样,另外,这个SQL,在原来MySQL上跑,都没上过慢查询日志(>200ms),所以,没有数据采样,没法发截图MySQL那边的执行情况。

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

推荐使用 obdiag 工具进行日志采集和根因分析,以定位和解决 SQL 性能问题。

日志采集场景: SQL性能问题
日志采集命令: obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

上述命令可以帮助收集与 SQL 执行性能相关的信息,包括 SQL 的执行计划、资源消耗情况等,通过分析这些信息可以进一步了解 SQL 在不同环境中的表现差异。请您按照上述命令进行日志的采集,并将采集到的日志压缩包提供给我们,以便我们能够更准确地定位问题。

另外,为了确定具体的问题,在此需要您提供一些信息:

  1. 该 SQL 的具体执行语句是什么?
  2. SQL 在 ODC 和 OCP 中的具体执行时间和资源消耗情况分别是什么样的?
  3. 测试环境和线上环境在配置上有什么区别,尤其是关于硬件配置、网络环境和数据库参数设置方面?
  4. 是否有其他同时运行的大查询或任务可能影响了 SQL 的执行效率?
  5. 测试环境和生产环境的负载是否相同?如果有差异,差异体现在哪些方面?

这些问题的答案将有助于我们更全面地理解您的问题,从而提供更加精准的帮助。谢谢!

附上敏捷诊断工具 obdiag 使用帮助链接

麻烦使用小助手推荐的obdiag采集一下。sql id使用sql诊断里的这条sql

使用obdiag收集一下 plan_monitor
obdiag gather plan_monitor --trace_id YB420BA2D99B-0005EBBFC45D5A00-0-0 --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’}”
https://www.oceanbase.com/docs/common-obdiag-cn-1000000004494424

你把ODC上执行的信息 使用obdiag收集一下
但从这个执行计划来看 nlj连接顺序来说有点问题 应该是小结果集的表驱动大结果集的表 看着才对 具体的执行计划使用obdiag拿到以后 才能更清楚

可以试一下 /+leading(r p) use_nl(p)/

学习

你这个SQL不同条件返回的行数应该都不一样吧,如果想确认ODC执行和业务执行时间不一致,拿同一条SQL来测试

1 个赞

点赞

学习了

老师,不好意思,回复晚了。

plan_monitor:
obdiag_gather_pack_20251219163710.zip (180.4 KB)

其实感觉执行计划是没啥问题的

老师,您好,

plan monitor:
obdiag_gather_pack_20251219163710.zip (180.4 KB)

因为条件在p表,执行计划没什么问题,就是不晓得好像有种越跑越慢的感觉。

image
你发给我的这个执行计划 其实执行并不慢 看着执行计划走的也没有问题 其实千行数据走nlj也没有问题 这个是在odc上跑的么 还是在系统跑的抓取的

这个是workbench上跑的,奇怪的是,OCP监控上看就是慢,可能是程序跑的时候,有什么环境性的问题,

所以,我才说,看数据,怎么感觉越跑越慢,自己去跑又不慢。可能oceanbase第一次跑,没跑快吧。 :smiling_face_with_tear:

另外,我们采集的监控数据>200ms,

应该有点无解。

我们这边硬是加了/*+ parallel(10) */来跑,现在好像稳定快了些。
至少不是OCP SlowSQL,SQL诊断 top 1了。

建议在ocp上的top sql看一下 按照最大的响应时间排序 再通过obdiag抓一下 plan_monitor信息 方便看看是什么问题 不确定是不是大小账号的问题

感谢老师,我去尝试一下。

虽然在我们从MySQL切换的过程中有点小问题,但是,ob的产品确实很棒。 :+1: :+1: :+1: