关于truncate table有没有使用鬼影记录的探讨

浏览: 2938

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

推荐 0
本文由 桦仔 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册