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 /zh-tw/help/2983175

SQL Server 2012 SP1 的累積更新 11 /zh-tw/help/2975396

SQL Server 2008 R2 SP2 的累積更新 13 /zh-tw/help/2967540

2014 年 SQL Server 累積更新 2 /zh-tw/help/2967546

適用於 SQL Server 2008 SP3 的累積更新 17 /zh-tw/help/2958696

關於 SQL Server 的累積更新

SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 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 產品中的問題。