SQLSERVER的鬼影记录翻译二

浏览: 2333

原文链接:http://www.sqlskills.com/blogs/paul/ghost-cleanup-redux/

之前写过一篇文章 Inside the Storage Engine: Ghost cleanup in depth.
今天有一个问题在我教的那个班的其中一个学生被提出来,关于鬼影记录的,所以我想用
一篇博文记录一下
问题:鬼影记录会发生在堆表中吗?答案是:NO 除非在不正常的情况下

当快照隔离级别打开的时候,堆表的记录删除会被记录为鬼影记录,作为版本管理的
的一部分,这会产生一些有趣的作用。一个版本记录会在末尾添加14个字节的标签,
所以堆表里的一个记录会比之前长度增加了14个字节的长度,这会意味着记录存放在
一个数据页里已经不再合适。这会导致记录移动,并会造成记录前滚,仅仅是因为记录删除了
现在,页面是充满数据的,存储引擎会采取一些措施去避免记录少于32个字节的长度
不过继续可能太深入了。

无论怎样,先抛开议题。我想展示给你在聚集索引表中删除记录和在堆表中删除记录的不同
我准备创建两张表,然后都删除记录,然后回滚

先执行下面sql语句

 1 USE [GPOSDB]
2 GO
3 CREATE TABLE t1 (c1 CHAR (10));
4 CREATE CLUSTERED INDEX t1c1 on t1 (c1);
5 GO
6
7 CREATE TABLE t2 (c1 CHAR (10));
8 GO
9
10 INSERT INTO t1 VALUES ('PAUL');
11 INSERT INTO t1 VALUES ('KIMBERLY');
12
13 INSERT INTO t2 VALUES ('PAUL');
14 INSERT INTO t2 VALUES ('KIMBERLY');
15 GO
 1 – prevent random background transactions
2 ALTER DATABASE [GPOSDB] SET AUTO_CREATE_STATISTICS OFF;
3 GO
4
5 BEGIN TRAN DelFromClust;
6 DELETE FROM t1 WHERE c1='KIMBERLY';
7 ROLLBACK TRAN;
8 GO
9
10 BEGIN TRAN DelFromHeap;
11 DELETE FROM t2 WHERE c1='KIMBERLY';
12 ROLLBACK TRAN;
13 GO
14
15 SELECT * FROM ::fn_dblog (null, null);
16 GO

这是一部分的事务日志记录。图中红色框部分是我关闭了自动更新统计信息
为了阻止其他无关事务的产生,以便更好地观察结果

上面那个红色框部分的第一个事务,是回滚聚集索引的删除记录操作的。你可以清晰看到
第三列显示出一个记录的删除使用了鬼影记录,另外,可以看到有设置PFS页里的位图中的位
以标记这个页面有鬼影记录存在。
上面第二个红色框的那部分,是回滚堆表的删除记录操作的。这里你可以看到数据库做的
是一个直接删除记录的动作。
如果你在做回滚操作之前查看过数据页的内容,你会看到聚集索引表里的记录标记为鬼影记录
而堆表里的记录你会看到真的是直接删除了

希望这篇文章帮到你

 

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

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

0 个评论

要回复文章请先登录注册