KB2967240 - ИСПРАВЛЕНО: невозможно освободить неиспользуемое пространство с помощью операции сжатия в таблице, содержащей столбец LOB в SQL Server

Применяется к
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). При обновлении столбца бизнес-приложений с уменьшенным размером данных бизнес-приложений и попытке освободить неиспользуемое пространство используются следующие методы:

  • DBCC SHRINKDATABASE / DBCC SHRINKFILE
  • ALTER INDEX REORGANIZE WITH (LOB_COMPACTION = ON)

В этом случае неиспользуемое пространство не подлежит высвобождению.

Решение

Эта проблема была впервые исправлена в следующем накопительном пакете обновления SQL Server.

Накопительный пакет обновления 2 для SQL Server 2012 с пакетом обновления 2 (SP2) /en-us/help/2983175

Накопительный пакет обновления 11 для SQL Server 2012 с пакетом обновления 1 (SP1) /en-us/help/2975396

Накопительный пакет обновления 13 для SQL Server 2008 R2 с пакетом обновления 2 (SP2) /en-us/help/2967540

Накопительный пакет обновления 2 для SQL Server 2014 г. /en-us/help/2967546

Накопительный пакет обновления 17 для SQL Server 2008 SP3 /en-us/help/2958696

Сведения о накопительных обновлениях для SQL Server

Каждый новый накопительный пакет обновления для SQL Server содержит все исправления и исправления безопасности, которые входили в состав предыдущего накопительного пакета обновления. Ознакомьтесь с последними накопительными пакетами обновления для SQL Server:

      

Временное решение

Чтобы обойти эту проблему, воспользуйтесь следующими временными решениями:

  • Экспортируйте все строки в новую таблицу и переместите их обратно. Это реорганизует данные бизнес-приложений и освободит неиспользуемое пространство.
  • Используйте DBCC SHRINKFILE с параметром EMPTYFILE, чтобы переместить все данные во вновь добавленный файл данных, а затем удалить старый файл данных. Это позволит реорганизовать бизнес-данные, освободив неиспользуемое пространство.

Дополнительные сведения

В следующем примере показано неиспользуемое пространство при использовании команды TSQL sp_spaceused "table_name" до и после обновления столбца LOB с меньшим размером данных LOB:
Перед обновлением:

имя строки зарезервировано данные index_size не используется
table_name 1000 261072 КБ 261056 КБ 16 КБ 0 КБ

После обновления:

имя строки зарезервировано данные index_size не используется
table_name 1000 261072 КБ 199672 КБ 16 КБ 61384 КБ

      

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».