幽灵清理设置

Ste*_*Bov 10 sql-server-2012 ghost-cleanup

我正在运行一个高事务数据库(平均约 175k 事务/分钟,每小时添加和删除近 900 万条记录)

直到最近,这还不是什么大问题,因为我们已经添加和删除了大约 750 万条记录,但是随着最新数据的涌入,幽灵清理似乎无法跟上清理表/索引上未使用的空间。

几天前,我们在 16 个表(主要是其中的 2 个)中达到了 53 GB 的“未使用空间”,因此开始研究 ghost 清理过程,发现它每 5 秒运行一次,并运行超过 10 页。

我目前的解决方案是清晨我正在运行以下命令的三个线程:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END
Run Code Online (Sandbox Code Playgroud)

赶上前一天晚上的积压(当我们大部分删除发生时)

我想知道是否有任何方法可以将默认设置从 5 秒和 10 页更改为每秒一次或运行超过 20 页,有没有办法做到这一点,或者我应该继续启动多个清理过程来清除数据,或者是否有任何其他操作可以帮助解决此问题

重新索引至少每周一次在最受影响的索引上运行(大多数是每隔一天)

AlwaysOn 高可用性集群上的 SQL Server 2012 Enterprise SP3_CU8(明天升级到 CU9)也带有复制(在单独的服务器上分发)

Kin*_*hah 4

我想知道是否有任何方法可以将默认设置从 5 秒和 10 页更改为每秒或运行超过 20 页

不,没有。至少我现在还不知道:-)

是否有任何其他行动可以帮助解决这个问题

来自 Paul Randal 的博客- 人们有时考虑的一种方法是通过执行表或索引扫描来强制 Ghost 清理来清理所有内容(从而将所有已删除的记录排队以进行 Ghost 清理任务)。

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)
Run Code Online (Sandbox Code Playgroud)

您是否可以对表进行分区并清除旧分区而不是进行删除?仅供参考.. SQL Server 2016 及更高版本也允许您截断单个分区。

另外,您可以(测试并实施) -禁用幽灵清理(跟踪标志 661),然后rebuild index WITH ONLINE = ON选择,因为您使用的是企业版。

如果您使用 AlwaysON(异步)进行复制,请确保启用跟踪标志 1448 - 即使异步辅助副本尚未确认接收到更改,也允许复制日志读取器继续前进。

请务必阅读Paul White 的《Deletes that Split Pages and Forwarded Ghosts》,看看您的表是否有会减慢速度的触发器或 LOB 列。