sqlserver中delete 和truncate的区别?

0
已邀请:
2

TravyLee - 尼玛!这哪是下雨,分明就是有人在泼水! 2013-07-09 回答



delete命令并不能完全释放掉表格或者索引的数据结构以及他们申请的页面。
在这一点上,SQL Server2005以后的版本比之前的版本做得好些,树比堆做
得更好些。


TRUNCATE语句和DELETE语句相比具有以下优点:


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

delete每删除一行数据,都会在事务日志中为删除的每行记录一个项。
truncate table通过释放用于存储数据的数据也来删除数据,并且在
事务日志中只记录页释放这个动作,而不是记录每一行。

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

3,表中毫无例外的不保留任何页
执行delete语句之后,表仍然会包含空页。例如,必须至少使用一个排他表锁,
才能释放堆中的空页。如果执行删除操作时没有使用表锁,表(堆)中将包含
许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后太清除
进程迅速释放。


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


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

1,在表格上建立聚集索引

2,如果所有数据都不要了,要使用truncate table语句,而不是drop table语句

3,如果表格本身也不需要了,直接drop table


此外需要说明的是:
在delete数据之后,SQL Server却没有完全释放空间,虽然这些空间没被释放掉,
但是当表格插入新的数据时,这些空间会被从新使用。


如果真的看着这些空间碍事,而表格又不能整个被删除,处理起来就有点麻烦。如
果表格有聚集索引,重建以下索引能释放这些页面,还是很方便的。但是没有聚集
索引,可能就要重建一张表,把数据从旧表里复制过去,然后删除旧表,释放空间
或者在这张表上创建一个聚集索引。
2

Gabriel - 茕茕白兔 东走西顾 衣不如新 人不如故 2013-07-09 回答

建议如非特别情况,还是使用DELETE,因为TRUNCATE虽然快速,但是在日志中查询不到操作记录,万一需要通过日志找回时候,就无法寻找回数据.

此点是否正确,需要请同学拍砖.
1

梁勇 - 天道酬勤、上善若水。爱好商业智能 2013-07-09 回答

简单说: TRUNCATE 删除 没有日志记录,DELETE 删除 有日志记录,可以找回数据。

要回复问题请先登录注册