DELETE和TRUNCATE之间的区别

DELETE和TRUNCATE之间的区别

摘抄自《SQLSERVER企业级平台管理实践》

与delete相比,truncate具有以下优点:

1、所用的事务日志空间较少

delete语句每次删除一行,并在事务日志中为所删除的每行记录一个项。truncate table通过释放用于存储表数据的数据页来删除数据,并且在事务

日志中只记录页释放这个动作,而不记录每一行

2、使用的锁通常较少

当使用行锁执行delete语句时,将锁定表中各行以便删除。truncate table始终锁定表和页,而不是锁定各行。

3、表中将毫无例外地留下任何页

执行delete语句后,表依然会包含空页。例如,必须至少使用一个排他表锁(LCK_M_X),才能释放堆中的空页。如果执行删除操作

时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。

 

truncate table删除表中的所有行,但表结构以及列、约束、索引等保持不变。若要删除表定义以及数据,请使用drop table语句

-------------------------------------------------华丽的分割线-----------------------------------------------------------

为了更及时地删除数据,释放空间,可以采用的方法有:

(1)在表格上建立聚集索引

(2)如果所有数据都不要了,要使用truncate table而不是delete

(3)如果表格本身不要了,就直接drop table

 ----------------------------------------------华丽的分割线------------------------------------------------------

 delete了的数据,SQLSERVER却没有完全释放空间,这不是空间泄漏吗?久而久之,我的数据库里会不会充斥着这些“没用”的页面,

把我的空间都浪费掉了?这倒不必担心,虽然这些页面没有被释放掉,但当表格里插入新的数据时,这些页面是会被重新使用的。

所以这些页面并没有被“泄漏”掉,会留给SQLSERVER重用

如果真的看着这些页面碍事,而表格又不能整个删除掉,处理起来有时候有点费事。如果表格有聚集索引,可以重建一下索引能释放掉

这些页面,还是挺简单的。但是如果没有,可能就要重建一张新表,把数据从旧表里倒过去,然后再删除旧表,释放空间;或者

在这张表上建一个聚集索引。这样有点折腾。所以表没用了,就直接删掉他;如果表还有用,那这些页面将来再有新数据插入时,

还会被利用上。一般没必要一定要逼着SQLSERVER把他们释放出来。

 --------------------------------------------华丽的分割线---------------------------------------------------------

有朋友说truncate table会使用鬼影记录,truncate table其实是不需要鬼影记录功能的,前者是直接把表里面的所有页面进行释放即可

 

 

如果有不对的地方,欢迎大家一起来拍砖o(∩_∩)o

posted @ 2013-06-16 12:01  桦仔  阅读(5952)  评论(0编辑  收藏  举报