SQL删除数据总结

1.-- truncate:

删除内容不删除定义、释放空间,truncate后不会留有任何页,速度快。

拉低高水位( 缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;   truncate会将高水线复位(回到最开始) ),在系统表里把相关的extend标记为未使用,而不写undo,基本不更新日志,日志里面只记录页释放,所用的事务日志空间较少,无法rollback。

truncate不会触发delete的触发器,因为truncate操作不记录各个行删除。

相当于是drop表以后建了一个同样定义的表(包括相关的约束和索引等)


2.--delete:

删除内容不删除定义,不释放空间,删空表后,会保留一个空的页,速度慢。

只是删除了表中的数据,在存储上来说只是在数据块上做了一个标记而已,数据没有真正删除,不影响表所占用的extent, 高水线(high watermark)保持原位置不动  ,要写undo,所删除的每行记录都会进日志,可以rollback。

如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,而truncate后,会恢复初始。


3.--DROP TABLE:

删除内容和定义,释放空间,速度快。

即drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态。



4.--使用总结:
想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.     想删除表,当然用drop     
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

你可能感兴趣的:(SQL)