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与delete的比较,其实truncate table没有必要使用鬼影记录

至于为什麽大家需要看一下我写的鬼影记录的文章作对比

我实验的时候使用了我的一篇随笔,修改了随笔里的一些sql语句,来模拟实验环境

了解了解一下SQLSERVER里的鬼影记录

关于鬼影记录的翻译一

我的实验就是修改《关于鬼影记录的翻译一》里的那个sql语句来做的

 1 USE [GPOSDB]
 2  GO
 3  CREATE TABLE t1 ( c1 CHAR(10) )
 4  CREATE CLUSTERED INDEX t1c1 ON t1 (c1)
 5  GO
 6  BEGIN TRAN PaulsTran
 7  INSERT  INTO t1 VALUES  ( 'PAUL' )
 8  INSERT  INTO t1 VALUES  ( 'KIMBERLY' )
 9 GO
10 TRUNCATE TABLE t1 --改为truncate table 你会发现在事务日志里查找不出鬼影记录
11  GO
12  
13  DBCC IND ('GPOSDB', 't1', 1);
14  GO
15  -----------------------
16  --补充一下:DBCC IND 里的page type列
17  PageType    
18  Page type: 
19  1 = data page, 
20  2 = index page,
21  3 = LOB_MIXED_PAGE, 
22  4 = LOB_TREE_PAGE, 
23  10 = IAM page
24  
25  ----------------------
26  DBCC TRACEON (3604);
27  GO
28  DBCC PAGE ('gposdb', 1, 482, 3);
29  DBCC PAGE ('gposdb', 1, 482, 2);

 

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM