MSSQL之GHOST CLEANUP幽灵清理后台进程

0    208    1

Tags:

👉 本文共约1774个字,系统预计阅读时间或需7分钟。

简介

从表中删除数据,或导致行移动的更新操作,通常会把数据从表中就地删除,并释放行所占用的存储空间,但是在某些情况下,该行实际上可以作为幽灵数据保留在数据页上。一行数据从索引页面的叶级别删除,并不总是实时从数据页中物理删除,而是把该记录标记为已删除,这个记录称作幽灵(ghost)记录。这意味着该行数据仍然保留在数据页中,但是行的内部存储结构中发生了变化,把该行标记为已删除(ghost)。

SQL Server内置了一个ghost cleanup进程,这是一个单线程的后台进程,用于删除被标记为已删除的幽灵数据。从SQL Server 2012版本之后,ghost cleanup进程每个5秒钟自动运行,检查数据页上是否存在标记为幽灵记录的数据行,如果找到幽灵数据,那么ghost cleanup进程会把它们从物理存储上删除,ghost cleanup每次执行都会至多检查10个Page。该进程会周期性的唤醒,并对所有索引中已被标记为删除的索引项进行检查,然后,将这些索引项物理移除。

Deletes operations from a table or update operations that cause a row to move can immediately free up space on a page by removing references to the row. However, under certain circumstances, the row can physically remain on the data page as a ghost record. Ghost records are periodically removed by a background process. This residual data is not returned by the Database Engine in response to queries.

清除幽灵数据的优点:

  • 释放存储空间,并把重新使用这部分空间存储更多的数据,避免数据文件的暴增
  • 能够一定程度上避免索引页的拆分(Page Split),由于Page存在部分未使用的空间,新的数据会直接使用这部分free space。

当一个记录被发现时,数据库就被标记为“有幽灵数据”,一旦删除所有的幽灵数据之后,数据库就会被标记为“没有幽灵数据”,ghost cleanup进程会跳过被标记为“没有幽灵数据”的数据库。

Ghost Cleanup 进程通常在服务重启后运行的,主要作用:

1)清理在聚集表下,记录被删除后形成的ghost记录。

当在聚集索引下删除记录,并没有真正的删除只是标记为ghost记录,这样删除会变得更快,回滚只需要撤销标记。当事务提交后后台有ghost清理程序来清理这些被标记为ghost记录。并且会保留最后一个数据页的最有一条ghost记录以免页没释放。

当记录被删除会在pfs上标记ghost,在数据页头上也会标记。但是pfs上的标记并不会通知处理程序处理。只有到下一次扫描到这个页时才会处理,或者等到每5秒一次的清理进程激活,清理进程就会扫描pfs页,并对ghost页处理。若没有需要清理的了就跳入下一个数据库。若这次扫描没有发现有ghost记录,那么会设置上一个标记,下5秒唤醒就跳过这个数据库。
Reference:https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-ghost-cleanup-in-depth/

查询索引中的幽灵数据的数量

用户可以通过dm_db_index_physical_stats来统计各个索引中包含的幽灵数据行的数量:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复