oracle DB中的删除速度很慢

Posted

技术标签:

【中文标题】oracle DB中的删除速度很慢【英文标题】:Deletion is slow in oracle DB 【发布时间】:2021-02-04 15:21:41 【问题描述】:

我们有一张没有太多数据的表。该表有 3 个分区,我们只删除一个分区中的数据。 从表 AB 分区(A)中删除,其中 id=value; 这里 id 也有一个索引,但删除仍然很慢。 id的数据类型为varchar2,值为number。

请帮助我理解为什么删除语句很慢。

【问题讨论】:

value 转换为字符串将消除隐式转换的需要。在 DELETE 期间调用的表上是否有触发器?是否有任何子表与您使用外键删除的记录相关联?如果有 FK,子表中的列是否被索引? 我建议包含一个执行计划,甚至是一个 autotrace/sql 监控报告 - 否则,您是在要求我们猜测您的 DELETE 为何缓慢 表中有多少行,使用 where 子句将删除多少行以及您正在使用的删除语句是什么,是否只是 DELTE from table where col1 = 'some value'或者它正在与其他表连接。 【参考方案1】:

我认为索引在这种情况下没有多大用处。它必须评估分区中的每一行以查看它是否匹配 id=value。通常这将是全表扫描,并且不会使用索引。这完全取决于分区中的行数需要多长时间。但也许我没有正确理解这个问题。我假设“值”是同一个表中的一列,比如 ID。

【讨论】:

如果索引没有帮助,由于 FTS,那么它实际上会阻碍,因为索引段本身必须与表一起维护。表上的所有其他索引也必须更新。由于索引的必要更新,DELETE(以及 UPDATE 和 INSERT)可能是相当昂贵的操作。这就是为什么创建索引是在更好的 SELECT 和更差的 DML 之间进行权衡的原因。

以上是关于oracle DB中的删除速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

多表级联删除表数据特别慢

oracle速度变慢,怎样解决

使用用户定义的函数和左加入 oracle 10g 的分页速度很慢

使用 BLOB 进行在线备份的速度

DB2如何快速删除大量记录

为啥在 C# 中的二维数组中按列写入速度很慢