导航
导航
文章目录
  1. 1、语言
  2. 2、功能
  3. 3、提交、回滚
  4. 4、trigger
  5. 5、高水位线(high-water-mark)
  6. 6、索引
  7. 7、extent
  8. 8、速度
  9. 9、资源
  10. 10、应用

数据库删除——delete、drop、truncate

1、语言

drop和truncate属于DDL(data definition languate)
delete是DML(data manilupation language)

2、功能

truncate和delete只删除数据,不删除表结构(定义)
drop语句将删除表的结构,以及约束(constrain)、触发器(trigger)、索引(index),依赖于表的存储过程/函数将保留,但是变为invalid状态

3、提交、回滚

delete是DML,所以操作会放到回滚段中,事务提交才生效,可回滚
drop和truncate是DDL,所以执行后会自动提交立即生效,原数据不会放到rollback segment中,不能回滚

4、trigger

delete可触发trigger,drop和truncate不能触发trigger

5、高水位线(high-water-mark)

delete高水位线保持原位置不动
truncate语句会将高水位线复位(回到最开始)
drop语句将表所占用的空间全部释放
关于高水位线,可参考: http://www.blogjava.net/decode360/archive/2009/07/14/287767.html

6、索引

truncate语句会重置所有索引,delete不会

7、extent

delete语句不影响表所占用的extend
truncate语句缺省情况下见空间释放到minextents个extent,除非使用reuse storage
drop语句将表所占用的空间全部释放

8、速度

一般来说,drop > truncate > delete

9、资源

truncate使用的系统事务日志资源较少
delete语句每删除一条数据,会在事务日志中为所删除的每一行记录一项,
truncate table 通过释放存储表数据所用的数据页来删除数据,并只在事务日志中记录页的释放

10、应用

删除表使用drop
保留表但删除数据,可使用truncate,
但需要注意,truncate不能使用在有foreign key约束的表,不能用于参与了索引视图的表,因为不记录在日志中所以不能激活trigger,应使用不带where字句的delete语句
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

参考:
http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html
http://blog.csdn.net/gumengkai/article/details/51079270