笔记297 关于鬼影的翻译二
笔记297 关于鬼影的翻译二
1 关于鬼影的翻译二 2 http://www.sqlskills.com/blogs/paul/ghost-cleanup-redux/ 3 之前写过一篇文章 Inside the Storage Engine: Ghost cleanup in depth. 4 今天有一个问题在我教的那个班的其中一个学生被提出来,关于鬼影记录的,所以我想用 5 一篇博文记录一下 6 问题:鬼影记录会发生在堆表中吗?答案是:NO 除非在不正常的情况下 7 8 当快照隔离级别打开的时候,堆表的记录删除会被记录为鬼影记录,作为版本管理的 9 的一部分,这会产生一些有趣的作用。一个版本记录会在末尾添加14个字节的标签, 10 所以堆表里的一个记录会比之前长度增加了14个字节的长度,这会意味着记录存放在 11 一个数据页里已经不再合适。这会导致记录移动,并会造成记录前滚,仅仅是因为记录删除了 12 现在,页面是充满数据的,存储引擎会采取一些措施去避免记录少于32个字节的长度 13 不过继续可能太深入了。 14 15 无论怎样,先抛开议题。我想展示给你在聚集索引表中删除记录和在堆表中删除记录的不同 16 我准备创建两张表,然后都删除记录,然后回滚 17 18 USE [GPOSDB] 19 GO 20 CREATE TABLE t1 (c1 CHAR (10)); 21 CREATE CLUSTERED INDEX t1c1 on t1 (c1); 22 GO 23 24 CREATE TABLE t2 (c1 CHAR (10)); 25 GO 26 27 INSERT INTO t1 VALUES ('PAUL'); 28 INSERT INTO t1 VALUES ('KIMBERLY'); 29 30 INSERT INTO t2 VALUES ('PAUL'); 31 INSERT INTO t2 VALUES ('KIMBERLY'); 32 GO 33 – prevent random background transactions 34 ALTER DATABASE [GPOSDB] SET AUTO_CREATE_STATISTICS OFF; 35 GO 36 37 BEGIN TRAN DelFromClust; 38 DELETE FROM t1 WHERE c1='KIMBERLY'; 39 ROLLBACK TRAN; 40 GO 41 42 BEGIN TRAN DelFromHeap; 43 DELETE FROM t2 WHERE c1='KIMBERLY'; 44 ROLLBACK TRAN; 45 GO 46 47 SELECT * FROM ::fn_dblog (null, null); 48 GO 49 50 这是一部分的事务日志记录。图中标记深色部分是我关闭了自动更新统计信息 51 为了阻止其他无关事务的产生,以便更好地观察结果 52 53 高亮部分的第一个事务,是回滚聚集索引的删除记录操作的。你可以清晰看到 54 第三列显示出一个记录的删除使用了鬼影记录,另外,可以看到有设置PFS页 55 以标记这个页面有鬼影记录存在。 56 没有高亮的那部分,是回滚堆表的删除记录操作的。这里你可以看到数据库做的 57 是一个直接删除记录的动作。 58 如果你在做回滚操作之前查看过数据页的内容,你会看到聚集索引表里的记录标记为鬼影记录 59 而堆表里的记录你会看到真的是直接删除了 60 61 希望这篇文章帮到你
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现