为什么删除比插入更长

Hel*_*707 3 sql oracle performance

为什么执行delete语句需要比插入更长的时间?

据我所知,删除触发索引和重做更改以及数据块.删除也是如此.

因此,我认为两个语句在同一个表上具有相似的执行时间.但完全不同.这有什么不同?

作为参考,dbms供应商是Oracle.该表没有触发器,两个索引绑定.

这只是一个简单的删除删除,where cdate>201411.

APC*_*APC 5

DELETE可能需要比插入更长的时间有几个原因:

主要的一点是DELETE是一个查询:数据库必须找到您要删除的记录.你的陈述是

"删除,where cdate>201411."

如果CDATE被索引,那么索引范围最好是扫描.如果它没有索引,那么它是一个全表扫描.但是,如果CDATE具有较差的聚类因子,则索引读取可能无法像完整表扫描那样执行.调整DELETE与调整SELECT语句非常相似.

无论哪种方式,阅读都要比插入记录要多得多.为什么数据库会这样做?因为需要撤消.当我们回滚时,数据库使用UNDO表空间中的信息来反转我们的语句.对于INSERT,撤消操作是删除操作,因此它所需要的只是插入行的ROWID.反转DELETE需要重新插入记录,因此整行必须存储在UNDO中.

因此DELETE操作必须检索整行并将其存储在UNDO中.记录越久,UNDO管理层的管理费用就越多.(相比之下,插入时ROWID是一个微小且固定的开销.)

同样地,(正如@lalitKumar所指出的)REDO日志卷对于删除来说可能要大得多.OraFAQ 在这里有一些有趣的体积.

外键可以影响插入和删除:插入必须检查引用表中是否存在键,而删除必须检查依赖表中的引用.这会将唯一键查找与非唯一或甚至未索引的列进行比较.

  • 重做大小非常重要.与插入相比,删除具有高重做大小. (2认同)

Tha*_*rif 1

如果您无论如何都要删除所有行,请考虑使用 TRUNCATE(如果可能)。

如果删除使用 WHERE 子句,请考虑您正在进行索引查找以提高效率(但请记住,更新删除的索引也会导致一些开销)

可能有会话当前正在使用当前对象(行可能会根据您的删除记录被锁定)。它正在等待,直到会话被清除或关闭。

回滚段也会花费您的时间。

另外,对于优化大量删除,请参考:

1.链接1

2.链接2