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

时间:2023-02-03 09:54:29

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

鬼影记录也叫 幻影记录、  虚影记录 英文名叫 ghost record

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

会出现鬼影记录的两种情况:(1)聚集索引表 (2)使用了快照隔离级别的堆表

相关文章:

http://support.microsoft.com/kb/2622823/zh-cn
http://www.sqlskills.com/blogs/paul/ghost-cleanup-redux/
http://www.cnblogs.com/Amaranthus/archive/2013/04/22/3036619.html#2664812
http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-ghost-cleanup-in-depth/

为什么在聚集索引的表里会出现鬼影记录,大家知道有聚集索引的表,里面数据页会用双向链表连接起来,如果马上删除,

那么就会影响索引查找数据,比如有一个事务正在利用聚集索引查找数据,万一这个时候删除了某一页,

那么查找出来的结果就不准确了,所以还是等空闲的时候,再慢慢地删除数据,反正我是这麽认为的

Ghost记录清理
问:在SQL Server企业管理器的进程信息窗口中,我找到了一个名为“Ghost Record Cleanup”(幻影记录清除)的后台进程,并且该命令由用户系统所引发。

答:在从数据库中删除行、页或扩展盘区时,SQL Server会将这些对象标记为“幻影”(表示删除操作有待执行),并在稍后使用后台任务清除这些对象,该进程就是Ghost Record Cleanup。Ghost Record Cleanup改善了Delete命令的性能,因为SQL Server无需立即执行物理清除操作。

 

下面的内容根据给出的文章链接总结出来

(sql server中ghost清理任务每5秒执行一次)可以使用跟踪标志661来关闭ghost清理工具的运行

这样会减少物理IO,因为清理需要把页保存在buffer pool,会产生日志,造成物理IO。

如果对于delete量比较大的数据库可以启用跟踪标志661,这样ghost清理任务就不会运行。

1 DBCC TRACEOFF(661,-1)--在全局范围关闭ghost清理工具
2 DBCC TRACESTATUS(661) --查看是否ghost清理工具是否在运行 status列

查看某一张表是否存在ghost记录

对于表扫描而言,该鬼影记录数越小越好,至于为什麽,因为在查询的时候,执行引擎还要判断是否有鬼影记录,如果是鬼影记录就跳过这条记录,继续下一条记录的查找

1 SELECT  [ghost_record_count], [version_ghost_record_count]
2 FROM    [sys].[dm_db_index_physical_stats](DB_ID('dlgpos'),   --数据库ID
3                                            OBJECT_ID('[DLGPOS].[dbo].[Accounts]'), --表的objectid
4                                            NULL, NULL,'detailed')

 

如果你想真正了解鬼影记录,可以看一下我翻译的两篇文章

鬼影记录翻译一

鬼影记录翻译二

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