按照主键update为什么执行时间还要200毫秒以上

【产品名称】

【产品版本】

【问题描述】

我有个一个,就是按照主键字段去update语句,反而执行时间还要200毫秒。

我看了sql_audit里的execute_time是140毫秒,get_pan_time是40毫秒。请问下针对一个几百万条数据的表,按照主键更新,需要200毫秒以上 合理吗?

该如何去分析这个sql语句的消耗哪?

语句类似:update test set upd_dt=:1 where id=‘afafdafdasfsdfsdfsdfs’;

一个update请求需要完成主表及相关索引的写入,按照sql语义检查约束、完成trigger等等,如果一切ok,需要读出旧值,然后将旧值和新值一起写入事务日志并同步到其他副本,因此考虑这个问题的分析要考虑较多因素:

  1. 当时是否资源规格较小或负载较高?
  2. 表上是否有全局索引,是否更新了索引列?是否绑定了约束或trigger?
  3. 机器间网络延迟是否较大?磁盘响应时间是否过长?

从哪里可以看到执行这个sql花费的具体各个阶段的时间哪?observer.log可以吗?这个咋个解析哪?

可以调整慢 SQL 记录的阈值,把这条 SQL 通过慢日志记录下来,然后分析日志信息,参考1、 https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.1/sql-statement-that-analyzes-sudden-jitter-of-rt-1 2、https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.2/trace_log_slow_query_watermark

我看了日志,发现很多update_gts耗时高,而且同一个trace竟然出现额sql_no高达34个。请问这个是什么原因哪?