Проблема
Предположим, что в 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:
- Последний накопительный пакет обновления для SQL Server 2012 с пакетом обновления 2 (SP2)
- Последний накопительный пакет обновления для SQL Server 2012 с пакетом обновления 1 (SP1)
- Последний накопительный пакет обновления для SQL Server 2008 R2 с пакетом обновления 2 (SP2)
- Последний накопительный пакет обновления для SQL Server 2014
- Последний накопительный пакет обновления для SQL Server 2008 с пакетом обновления 3 (SP3)
Временное решение
Чтобы обойти эту проблему, воспользуйтесь следующими временными решениями:
- Экспортируйте все строки в новую таблицу и переместите их обратно. Это реорганизует данные бизнес-приложений и освободит неиспользуемое пространство.
- Используйте 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, перечисленных в разделе «Относится к».