如何高效批量delete数据

【问题描述】
每日白天insert 2亿的数据量,晚间会批量分多次limit 60w删除固定条件和状态的数据。刚开始执行delete from t1 where ts > ‘20240401’ and status == 0 limit 600000 执行约10s,删除几十次后,delete执行耗时越来越慢,约几分钟。

请问:除了设置表级别的queuing属性外,有没有稳定且高效的delete的方法?

2 个赞

你好,请问ob是什么版本的呢?
#可以先使用obdiag进行一下SQL性能问题分析, (此处env中的trace_id对应gv$ob_sql_audit的trace_id)
obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’, trace_id=‘xx’}”

1 个赞

您好,请问你这个条件的总数据量是多少,如果不是特别多,可以建议定时任务每分钟delete limit一次,每次limit 数据量尽量控制2w一次,执行次数多一点, 这样不会造成慢sql

1 个赞

1、使用OB什么版本?你这个场景还挺符合queuing表,不使用该方式的主要考虑是?
2、表的数据量也挺大,数据业务删除特征可以考虑分区?然后删除数据按照分区删除?
3、delete几十次,sql语句一直是上面那个?普通表多次删除,没合并之前删除的数据应该还在存储层,sql处理扫描的数据块应该会多,你可以使用explain extended分析一下您的sql语句,在输出的信息Optimization Info: 相关地方应该可以看到table_rows、physical_range_rows、logical_range_rows、index_back_rows等信息。看看sql是否有优化空间。

1 个赞

如果业务上不合适分区表,queuing表是最优方案了

1 个赞

后来的解决方案:delete sql 按照主键范围顺序删除,这样也可以解决问题!

3 个赞