转自:http://chenxy.blog.51cto.com/729966/168459
1、相同点
a.都可以删除数据,其中truncate用于全表清空数据,而delete可以选择的删除
2、不同点:
a.回滚,delete支持事物回滚,而truncate不支持。
延伸:在oracle中事物能回滚,是因为oracle中设计的undo表空间。数据再删除后仍能回滚是因为把数据放到了undo表空间
delte属于DML语言,DML语言需要手动提交事物,可以进行事务回滚
truncate属于DDL语言,DDL语言属于隐式提交事务,因此不能进行回滚
b.高水线
oracle中的表用来容纳数据的上限。high water mark(可形象理解为水库的历史最高水位),一般情况,每次增长为5个数据块。
delete操作执行时,不影响数据所占用的数据块,高水线保持不变
truncate操作执行时,会释放数据占用空间。高水线位置下降。也可以通过reuse store 来进行复位
可以通过数据库自带的block命令观察效果,oracle分配区时默认一次是7+1个,增长是5个.其中一些sql优化是针对数据占用空间来进行的,
因为在查询数据时,即使该表没有数据,但只要占用了数据空间都会进行全表扫描。
c.空间占用
delete不会释放,而truncate则回收了数据空间
d.效率
可以通过删除数据所用时间来比较,结论:truncate>delete,(因为delte把数据放到了undo表空间)