需要 SQL Server Frozen Ghost Cleanup 解决方法

Ole*_*Dok 15 sql-server sql-server-2008-r2 ghost-cleanup

我有几个表,行数在 5M 到 1.5G 之间

每个表都有其 BLOB 字段,其大小从 100 字节到 30 兆字节不等,并存储为“行外大值类型”= ON

表存储在不同的文件组中,每个文件组有 3-4 个文件@不同的 LUN@非常快的 SAN

这些表每天增长 5-100 Gb 和 600k - 1.5M 行

经过一段时间后,从 2 周到 6 个月不等,一些行被删除或移动到存档数据库,因此 - 工作表中没有任何超过 6 个月的行。

服务器当前配置:

  • SQL 服务器引擎是 2008 R2 SP1 Enterprise @ 24 核,@ 64Gb RAM
  • SQL Server 使用额外的启动标志运行:

-T 3640; (消除了为存储过程中的每个语句向客户端发送 DONE_IN_PROC 消息。这类似于 SET NOCOUNT ON 的会话设置,但是当设置为跟踪标志时,每个客户端会话都以这种方式处理)

-T 1118;(将 tempDB 中的分配从一次 1pg(对于前 8 页)切换到一个范围。)

-T 2301;(启用特定于决策支持查询的高级优化。此选项适用于大型数据集的决策支持处理)

-T 1117;(一次增长所有数据文件,否则依次增长。)

-E; (增加为文件组中每个文件分配的区数。此选项对于运行索引或数据扫描的用户数量有限的数据仓库应用程序可能有用)

-T 834; (导致 SQL Server 对为缓冲池分配的内存使用 Windows 大页分配, http://msdn2.microsoft.com/en-us/library/aa366720.aspx,http : //support.microsoft。 com/kb/920093 )

  • SQL Server 使用大页面扩展
  • SQL Server 利用快速文件初始化选项
  • 所有数据库的 AUTOSHRINK 都关闭

问题是- 从服务器正常运行时间(从几天到几个月)的某个时间点开始,GHOST CLEANUP进程拒绝执行强制清理并只是执行其通常的工作 - 在几秒钟内清理几个页面 ( which is seen thru Extended Events),这是不合适的,因为它无法清理所有已删除的行

问题从 SQL Server 2005 RTM Enterprise 时代开始

我是如何尝试解决这个问题的:

  • 试图对表的聚集索引强制执行 SCAN 操作
  • 试图强制 SCAN 操作,这涉及表的聚集索引上的 BLOB 列的所有内容
  • 系统 sp_clean_db_free_space & sp_clean_db_file_free_space
  • 为数据库中的所有文件和页面手动 dbcc cleanpage(@dbid , @fileid, @page)
  • 聚集索引重建和重组
  • 重建数据库
  • DBCC 强制鬼魂清理

  • 当我运行查询时:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
    
    Run Code Online (Sandbox Code Playgroud)

    我看到数以百万计的幽灵记录,但仅适用于 LOB_DATA 的分配单元类型

唯一有帮助的事情:

  • 使用 SHUTDOWN 命令停止服务器或重新启动整个主机 - 它有帮助,重新启动 GHOST CLEANUP 进程后运行几个小时并实际清除所有幻影记录
  • 带有 EMPTYFILE 选项的 DBCC SHRINKFILE - 将所有数据从一个文件移动到另一个文件或新创建的文件只会清理该文件中的幻影记录 - 问题是我真的很讨厌收缩操作。一个文件需要 3-4 天

问题- 是否存在任何程序化(优选)或维护方式来强制 GHOST CLEANUP 根本没有服务器停机,因为服务器停机成本太高,甚至不可接受 - 从每小时数千美元到数万美元不等

发现问题和我的一样:

这里也是一样:

Ole*_*Dok 12

最后,MS 已将此问题视为错误:http : //support.microsoft.com/kb/2622823

简而言之:它固定在

  • Sql Server 2008 SP3 CU4
  • Sql Server 2008 R2 CU10
  • Sql Server 2008 R2 SP1 CU4

在 Sql Server 2012 SP1 中,我在超过一年的运行时没有遇到这个问题。