日期:2014-05-16  浏览次数:20409 次

如何海量删除全表数据--Truncate table同delete,drop的区别
曾经在SQL SERVER中删除全表海量数据(》200W笔),用delete删除了半天.被前辈看到后大骂我蠢:"用truncate table啊"。
可怜我才疏学浅,后去遍查资料,方知truncate table兄实乃快速删除全表之人间利器啊.现将其优劣道之一二:
       从功能上看,truncate table同不带where子句的delete是一样的,但是其运行速度决定是杠杠的(),要远远快于delete同学.

一。truncate table优点:以下是truncate table同delete相比的优点,

1.所用的事务日志空间较少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一个条目。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。这也是truncate table删除全表速度优于delete的原因.
2.使用的锁通常较少。当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。
3.表中不留下任何页。执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。

二.truncate table的使用
     那么可不可以用 TRUNCATE TABLE 代替不带 WHERE 的 DELETE 呢?在以下情况是不行的:
1.要保留标识的情况下不能用 TRUNCATE TABLE,因为 TRUNCATE TABLE 会重置标识(如表中的自增量类型字段).TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
2.需要使用触发器的情况下不能使用 TRUNCATE TABLE ,它不会激发触发器。
3.对于由 FOREIGN KEY 约束引用的表(即主键所在的表,不是外键所在的表)不能使用 TRUNCATE TABLE。
4.对于参与了索引视图的表不能使用 TRUNCATE TABLE ,注意指索引视图,并非普通视图。

看来,truncate虽然好用,但也有一定的限制,使用该方法操作表时,先确定对象表中是否有标识,触发器,是否参与了索引视图等.个中玄机,还是在使用中慢慢体味吧~