drop,delete 和 truncate

相同点: 
truncate 和不带 where 子句的 delete,以及 drop 都会删除表内的数据  
 
不同点: 
 
1. truncate 和 delete 只删除数据不删除表的结构(定义)  
  drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。 
 
2delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。 
  truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。 
 
3.delete 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动  
显然 drop 语句将表所占用的空间全部释放。 
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。 
 
4.速度,一般来说: drop> truncate > delete  
 
5.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及  
使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大.  
想删除表,当然用 drop  
想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。 
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。 
 
通俗的讲: 
 
在实际应用中,三者的区别是明确的。 
 
当你不再需要该表时, 用 drop
 
当你仍要保留该表,但要删除所有记录时, 用 truncate; 
 
当你要删除部分记录时(always with a WHERE clause), 用 delete 
 
--------------------------------- 
上面是sql联机丛书上说的,似乎很少有书提到truncate table,也似乎很少用到它。今天看到一个问题则正是需要它。 
问题:有一个拥有1亿条数据的表,只需要保留其中的5条,其他删除,如何做?  
 
这就需要用truncate table来搞定了,如下: 
select 5条数据 into #临时表 from 1亿条数据的牛X表 
 
truncate table 1亿条数据的牛X表 
--让它牛X,不到10毫秒干掉它。 
 
insert 1亿条数据的牛X表 select * from #临时表 
 
drop table #临时表 
 
 
posted @ 2010-10-25 21:34  qanholas  阅读(283)  评论(0编辑  收藏  举报