最近在项目中发现一个问题,当每次删除同一条数据,然后再重新添加到DB中程序会死了!
百度一下才知道是delete table和truncate table的关系,跟大家分享一下···
delete语句删除表中数据时,并不能释放被占用的数据块空间,只是把那些被删除的数据块标记为无效(unused),将来还可以使用回退(roll back)操作恢复过来。
truncate语句删除表中的数据可以释放掉那些占用的数据块,不能进行回退操作。因此进行此操作时,一定要慎重。语法格式为:truncate table 表名;
另外,delete语句属于DML操作,会进行重做日志的记录,也会产生undo data,所以delete大量数据时会很慢,好处是可以进行rollback回滚操作,也可以使用闪回技术恢复;而truncate语句属于DDL操作,不能回滚(因为DDL属于隐式事务,会自动提交的)。但是truncate语句实质上只是将表的高水位线(HWM)标为0,意味着没有数据了,所以它的执行速度很快(因为只是改了一下HWM)。另外truncate后再加入新数据,执行表扫描时只扫描新占用的数据块;而delete数据后因为高水位线没有变化,所以还是会扫描原来的所有数据块,性能会很差。