KB2967240 - 修复:无法在包含 SQL Server 中 LOB 列的表中使用收缩操作回收未使用的空间

应用对象
SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

症状

假设您有一个表,其中包含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 的最新累积更新:

      

解决方法

要解决此问题,请使用以下解决方法:

  • 将所有行导出到新表,然后将行移回。 这将重新组织 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 产品中存在问题。