我有几张表,行数在5M和1.5G之间
每个表都有其BLOB字段,其大小从100字节到30 MBytes不等,并存储为“行外的大值类型” = ON
表存储在不同的文件组中,每个3-4个文件存储在不同的磁盘上@不同的LUNs @快速SAN
这些表每天增长5-100 Gb,并具有60万-150万行
经过一定时间(从2周到6个月不等)后,某些行将被删除或移至归档DB,因此-工作表中没有任何行超过6个月的行。
服务器的当前配置:
- SQL Server引擎是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')
我看到了数以千万计的幽灵记录,但仅适用于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
和这里是一样的: