存储过程,带参数,首次调用延时问题

版本:5.7.25-OceanBase_CE-v4.2.0.0
MYSQL存储过程,大概两百行内容。
测试调用存储存储过程会有延时,在存储过程开始和末段都insert一条记录。结果开始调用存过到插入第1条insert记录,中间就有几十秒的延时。即call开始到存储过程的最开始的第1个insert语句,中间就有几十秒的延时。
不管是用工具连接调用还是接口调用,都有这个问题,存储过程调用另外一个存储过程,另外一个存储过程也会有调用延时问题。

第一次调用都有这个问题,第2次调用则快很多

可以使用全链路诊断方法获取下对应的调用链信息,看下是哪一步骤出现了延迟问题。
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218369

另外,预告下1.5版本的obdiag会支持全链路诊断的功能

实际是存储过程CALL到真正运行起来,中间就花了几十秒,我看不少人都遇到这种问题,能查查你们数据库的问题吗?

你好,应该是第一次编译慢,可以收集下trace日志看下执行存储过程的耗时

每次慢都是隔几分钟后。我觉得是几分钟后存储过程的执行计划缓存没了,重新调用又要生成新的执行计划耗了时间,重新调用后,第一次也是花费很长时间,然后调用就快了。如此循环!

存储过程没有多次编译,现象是每隔一会(几分钟)首次调用就慢,然后调用才快。我猜测是几分钟后存储过程的执行计划缓存没了,重新调用又要生成新的执行计划耗了时间,重新调用后,第一次也是花费很长时间,然后调用就快了。如此循环!

如果是这样,存储过程调用生成执行计划要花费几十秒效率也太慢了,而且执行计划缓存几分钟就会失效

带参数不会那么容易穿线缓存失效的问题,ddl会导致缓存失效,是不是中间有过ddl?

没有,存储过程就只有update、delete、insert操作而已,

麻烦确认下
1.是否使用了临时表
2.是否切换了session
3.收集下trace日志

1、未使用临时表
2、未切换session

收集到trace日志发上来吗

是的

trace.zip (1.5 MB)
您看下日志,存储过程PRO_SET_SCORE

老师,获取的observer日志应该不全,麻烦让重新执行下,取下完整的observer日志和trace_id

https://mijuguanjia.wehufu.cn:1088/files/suyh/observer.zip
https://mijuguanjia.wehufu.cn:1088/files/suyh/trace.zip
老师,您看下日志,存储过程PRO_SET_SCORE

已转发给相关老师帮忙确认

老师,当前首次调用慢应该是符合预期的吧,没有命中plan_cache,走了完整的sql解析过程,当前日志内并没有明显可以看到报错的地方,慢的sql和快的sql的物理执行计划和sql_audit信息是否存在呢,对比分析一下会更好

测试存储过程.txt (4.1 KB)

老师,你看下我附件这个测试的很简单存储过程,
每次首次调用call PRO_SET_SCORE123();都会很慢(这个可以通过删除重新创建存储过程测试)
隔一段时间再调用也很慢,接着调用就好了。

已经转发给相关的研发老师进行判断

DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (
col1 varchar(200),
col2 varchar(200),
col3 varchar(200)
) ENGINE = oceanbase CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci
INSERT INTO table1 VALUES (‘11’, ‘11’, ‘11’);
INSERT INTO table1 VALUES (‘22’, ‘22’, ‘22’);
INSERT INTO table1 VALUES (‘33’, ‘33’, ‘33’);