我有几张表,行数在 5M 到 1.5G 之间
每个表都有其 BLOB 字段,其大小从 100 字节到 30 MB 不等,并且存储为“行外的大值类型”= ON
表存储在不同的文件组中,每个文件组有 3-4 个文件,每个文件在不同的磁盘上 @ 不同的 LUN @ 非常快的 SAN
这些表每天都会增长 5-100 Gb,行数为 600k - 150 万
经过一定的时间,从 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 FORCEGHOSTCLEANUP
当我运行查询时:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
我看到数以百万计的幽灵记录,但仅适用于 LOB_DATA 的分配单元类型
唯一有帮助的东西:
- 使用 SHUTDOWN 命令停止服务器或重新启动整个主机 - 它会有所帮助,重新启动后 GHOST CLEANUP 进程会运行几个小时并实际清除所有重影记录
- 带有 EMPTYFILE 选项的 DBCC SHRINKFILE - 将所有数据从一个文件移动到其他文件或新创建的文件只会清除该文件中的幽灵记录 - 问题是我真的很讨厌收缩操作。一个文件需要 3-4 天
问题- 是否存在任何程序化(首选)或维护方式来强制 GHOST CLEANUP 而无需服务器停机,因为服务器停机成本太高,甚至无法接受 - 每小时从数千美元到数万美元
发现与我类似的问题在这里:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
和这里一样:
最后,MS 已将此问题视为错误:http: //support.microsoft.com/kb/2622823
简而言之:它固定在
在 Sql Server 2012 SP1 中,我运行时没有遇到这个问题超过一年。
这是应该向 CSS 提出的问题,以便他们可以与您一起解决问题。您可能有软件保证和支持合同。如果重新启动实例每小时花费数千美元,那么几百美元应该没什么大不了的。
您是否尝试过允许数据库关闭然后联机?这将导致崩溃恢复运行,并可能启动幽灵清理。
你经常写信给桌子吗?经常是指一直?
至于 MSKB 932115,您是否看到幽灵记录仅留在所有文件中,还是清理文件组中的第一个文件?
为什么使用-T1117 和即时文件初始化?