应用对象
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

  • 更改索引(LOB_COMPACTION = ON)重新组织

在这种情况下,不能回收未使用的空间。

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 产品存在的问题。

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。