全表更新太慢,数据量约65W

可以参考我之前这个案例 数据库技术博客-OceanBase分布式数据库

您好,这张表确实有触发器写入另外一张表,但是相同条件下,MySQL执行耗时不到1min,OB 20min都未结束。

看了下,这张表有触发器会写入另一张表,但是去MySQL测试,也就1min不到写完了,OB 20min没有反应,这个场景是可以复现的。没有触发器的话,也是1min内更新完。

1 个赞

学到就是赚到

可以分别对比下有触发器和删除触发器的执行计划。。估计有变化

变化非常大,没有触发器的30S左右就跑下来了,有触发器的 20min以上一直卡下去,还没有结束的感觉。。。

我说是执行计划,可以用explain extended命令查看下

有触发器:


无触发器:

目前看,执行计划显示基本是一样的

看着无触发器走的算子和有触发器走的算子不一样

  1. DISTRIBUTED TABLE RANGE SCAN(分布式表范围扫描):

分布式表范围扫描是指在分布式环境下,针对整个分布式表进行的范围扫描。在这种扫描方式下,OceanBase 会根据分区键将数据分布在多个节点上,并且在每个节点上执行范围扫描操作。这种方式可以充分利用集群的计算和存储资源,提高查询性能。

  1. TABLE RANGE SCAN(表范围扫描):

表范围扫描是指在一个单个的表上进行范围扫描。这种扫描方式通常用于非分布式环境或者只涉及到一个分区的数据查询。在这种情况下,查询只会在一个节点上执行。

你这个更新慢 应该和你触发器有关系

噢噢,那老师目前的现象就是有触发器的走分布式表扫,太慢了,感觉时间上和单表扫也不是*3的关系(目前是1-1-1架构), 分布式扫基本就是卡死走不动的样子

按照我上面发的 obdiag收集一下sql信息 具体看看

1 个赞

好的 我收集下

能查询个gv$ob_SQL_AUDIT的记录吗,看下更新SQL的记录

这个卡死跑不下去,SQL_AUDIT输不出来。。。

复现:
1、create table t1(i int primary key,j int);

2、create table t2(i int);

3、CREATE trigger t1_update after update on t1

for each row

insert into t2 (i)

values (old.i);
4、插入t1表数据量约65W
5、update t1 set j=j+1;

SET _force_parallel_query_dop = 128;
SET _force_parallel_dml_dop = 128;
这两个参数试过吗?

试过,没有什么效果

问题已定位:
该版本触发器与事务的联动调度存在性能问题,同一个事务内循环调用PL时,savepoint的内存不会立即释放,事务处理与触发器调用就会越来越慢,从开始的微秒级别退化到毫秒甚至十毫秒级别,导致触发器长时间执行不完。后续版本会修复。

2 个赞