了解了解一下SQLSERVER里的鬼影记录
鬼影记录也叫 幻影记录、 虚影记录 英文名叫 ghost record
会出现鬼影记录的两种情况:(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