症状
假设你有一个表,其中包含 Microsoft SQL Server 2008、SQL Server 2008 R2、SQL Server 2012 或 SQL Server 2014 中的大型对象(LOB)列。 当您使用较小的 LOB 数据大小更新 LOB 列并尝试使用以下方法回收未使用的空间时:
-
DBCC SHRINKDATABASE/DBCC SHRINKFILE
-
更改索引(LOB_COMPACTION = ON)重新组织
在这种情况下,不能回收未使用的空间。
解决方案
在 SQL Server 的以下累积更新中,此问题首先已修复。
SQL Server 2012 SP2 的累积更新2 /en-us/help/2983175
SQL Server 2012 SP1 的累积更新11 /en-us/help/2975396
SQL Server 2008 R2 SP2 的累积更新13 /en-us/help/2967540
SQL Server 2014 的累积更新2 /en-us/help/2967546
SQL Server 2008 SP3 的累积更新17 /en-us/help/2958696
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
解决方法
要解决此问题,请使用以下解决方法:
-
将所有行导出到新表,并将行移回。 这将重新组织 LOB 数据并释放未使用的空间。
-
使用带有 EMPTYFILE 选项的 DBCC SHRINKFILE 将所有数据移动到新添加的数据文件中,然后删除旧的数据文件。 这将通过释放未使用的空间来重新组织 LOB 数据。
更多信息
以下示例显示了在更新 LOB 列之前和之后使用 TSQL 命令 sp_spaceused "table_name" 的空间,在更新之前和之后:
姓 |
行 |
保留 |
数据 |
index_size |
snap |
table_name |
1000 |
261072 KB |
261056 KB |
16 KB |
0 KB |
更新后:
姓 |
行 |
保留 |
数据 |
index_size |
snap |
table_name |
1000 |
261072 KB |
199672 KB |
16 KB |
61384 KB |
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。