Проблемы
Предположим, что у вас есть таблица, содержащая столбец больших объектов (LOB) в Microsoft SQL Server 2008, SQL Server 2008 R2, SQL Server 2012 или SQL Server 2014. Когда вы обновляете столбец LOB меньшим размером данных LOB и попытайтесь освободить неиспользуемое пространство с помощью указанных ниже способов.
-
DBCC SHRINKDATABASE/DBCC SHRINKFILE
-
ИНСТРУКЦИЯ ALTER INDEX WITH (LOB_COMPACTION = ON)
В этом случае неиспользуемое пространство невозможно освободить.
Решение
Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.
Накопительное обновление 2 для SQL Server 2012 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 с пакетом обновления 3 (SP3) /en-us/help/2958696
Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.
-
Последнее накопительное обновление для SQL Server 2012 с пакетом обновления 2 (SP2)
-
Последнее накопительное обновление для SQL Server 2012 с пакетом обновления 1 (SP1)
-
Последнее накопительное обновление для SQL Server 2008 R2 с пакетом обновления 2 (SP2)
-
Последнее накопительное обновление для SQL Server 2008 с пакетом обновления 3 (SP3)
Обходное решение
Чтобы обойти эту проблему, используйте описанные ниже временные решения.
-
Экспортируйте все строки в новую таблицу и перемещайте строки назад. Это переупорядочивает данные LOB и освобождает неиспользуемое пространство.
-
Используйте DBCC SHRINKFILE с параметром EMPTYFILE, чтобы переместить все данные в новый файл данных и затем удалить старый файл данных. Это переупорядочивает данные LOB там, освобождая неиспользуемое пространство.
Дополнительная информация
В следующем примере показано неиспользуемое пространство с помощью команды 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 БАЗА |
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".