Hel*_*707 3 sql oracle performance
为什么执行delete语句需要比插入更长的时间?
据我所知,删除触发索引和重做更改以及数据块.删除也是如此.
因此,我认为两个语句在同一个表上具有相似的执行时间.但完全不同.这有什么不同?
作为参考,dbms供应商是Oracle.该表没有触发器,两个索引绑定.
这只是一个简单的删除删除,where cdate>201411
.
DELETE可能需要比插入更长的时间有几个原因:
主要的一点是DELETE是一个查询:数据库必须找到您要删除的记录.你的陈述是
"删除,
where cdate>201411
."
如果CDATE被索引,那么索引范围最好是扫描.如果它没有索引,那么它是一个全表扫描.但是,如果CDATE具有较差的聚类因子,则索引读取可能无法像完整表扫描那样执行.调整DELETE与调整SELECT语句非常相似.
无论哪种方式,阅读都要比插入记录要多得多.为什么数据库会这样做?因为需要撤消.当我们回滚时,数据库使用UNDO表空间中的信息来反转我们的语句.对于INSERT,撤消操作是删除操作,因此它所需要的只是插入行的ROWID.反转DELETE需要重新插入记录,因此整行必须存储在UNDO中.
因此DELETE操作必须检索整行并将其存储在UNDO中.记录越久,UNDO管理层的管理费用就越多.(相比之下,插入时ROWID是一个微小且固定的开销.)
同样地,(正如@lalitKumar所指出的)REDO日志卷对于删除来说可能要大得多.OraFAQ 在这里有一些有趣的体积.
外键可以影响插入和删除:插入必须检查引用表中是否存在键,而删除必须检查依赖表中的引用.这会将唯一键查找与非唯一或甚至未索引的列进行比较.