症状
假设您有一个表,其中包含Microsoft SQL Server 2008、SQL Server 2008 R2、SQL Server 2012 或 SQL Server 2014 中 (LOB) 列的大型对象。 当您使用较小的 LOB 数据大小更新 LOB 列并尝试使用以下方法回收未使用的空间时:
- DBCC SHRINKDATABASE / DBCC SHRINKFILE
- ALTER INDEX REORGANIZE WITH (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 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
- SQL Server 2012 SP2 的最新累计更新
- SQL Server 2012 SP1 的最新累计更新
- SQL Server 2008 R2 SP2 的最新累计更新
- SQL Server 2014 的最新累计更新
- SQL Server 2008 SP3 的最新累计更新
解决方法
要解决此问题,请使用以下解决方法:
- 将所有行导出到新表,然后将行移回。 这将重新组织 LOB 数据并释放未使用的空间。
- 将 DBCC SHRINKFILE 与 EMPTYFILE 选项配合使用,将所有数据移动到新添加的数据文件,然后删除旧数据文件。 这会通过释放未使用的空间来重新组织 LOB 数据。
详细信息
下面的示例演示了在使用较小的 LOB 数据大小更新 LOB 列之前和之后使用 TSQL 命令sp_spaceused“table_name”的未使用空间:
更新之前:
| 名称 | rows | 保留 | 表 | index_size | 未使用 |
|---|---|---|---|---|---|
| table_name | 1000 | 261072 KB | 261056 KB | 16 KB | 0 KB |
更新后:
| 名称 | rows | 保留 | 表 | index_size | 未使用 |
|---|---|---|---|---|---|
| table_name | 1000 | 261072 KB | 199672 KB | 16 KB | 61384 KB |
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。