Symptomy
Załóżmy, że istnieje tabela zawierająca kolumnę dużego obiektu (LOB) w programie Microsoft SQL Server 2008, SQL Server 2008 R2, SQL Server 2012 lub SQL Server 2014. W przypadku aktualizowania kolumny typu LOB o mniejszym rozmiarze danych LOB i próbie odzyskania nieużywanego miejsca przy użyciu następujących metod:
-
DBCC SHRINKDATABASE/DBCC SHRINKFILE
-
ALTER INDEKS REORGANIZUJ ZA POMOCĄ (LOB_COMPACTION = ON)
W tej sytuacji nie można odzyskać niewykorzystanego miejsca.
Rozwiązanie
Ten problem został po raz pierwszy rozwiązany w poniższej zbiorczej aktualizacji programu SQL Server.
Zbiorcza aktualizacja 2 dla programu SQL Server 2012 z dodatkiem SP2 /en-us/help/2983175
Zbiorcza aktualizacja 11 dla programu SQL Server 2012 z dodatkiem SP1 /en-us/help/2975396
Zbiorcza aktualizacja 13 dla programu SQL Server 2008 R2 z dodatkiem SP2 /en-us/help/2967540
Zbiorcza aktualizacja 2 dla programu SQL Server 2014 /en-us/help/2967546
Zbiorcza aktualizacja 17 dla programu SQL Server 2008 z dodatkiem SP3 /en-us/help/2958696
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:
-
Najnowsza Zbiorcza aktualizacja dla programu SQL Server 2012 z dodatkiem SP2
-
Najnowsza Zbiorcza aktualizacja dla programu SQL Server 2012 z dodatkiem SP1
-
Najnowsza Zbiorcza aktualizacja dla programu SQL Server 2008 R2 z dodatkiem SP2
-
Najnowsza Zbiorcza aktualizacja dla programu SQL Server 2014
-
Najnowsza Zbiorcza aktualizacja dla programu SQL Server 2008 z dodatkiem SP3
Obejście
Aby obejść ten problem, Skorzystaj z poniższych obejść:
-
Eksportuj wszystkie wiersze do nowej tabeli i Przenieś wiersze wstecz. Spowoduje to ponowne zorganizowanie danych LOB i zwolnienie nieużywanego miejsca.
-
Użyj polecenia DBCC SHRINKFILE z opcją EMPTYFILE, aby przenieść wszystkie dane do nowo dodanego pliku danych, a następnie usuń stary plik danych. Dzięki temu Reorganizuje dane LOB, zwalniając nieużywane miejsce.
Więcej informacji
W poniższym przykładzie przedstawiono nieużywane miejsce za pomocą polecenia TSQL sp_spaceused "table_name" przed aktualizacją i po zaktualizowaniu kolumny LOB o mniejszym rozmiarze danych LOB:
nazwę |
wiersza |
zarezerwowan |
danymi |
index_size |
użyty |
table_name |
1000 |
261072 KB |
261056 KB |
16 KB |
0 KB |
Po zaktualizowaniu:
nazwę |
wiersza |
zarezerwowan |
danymi |
index_size |
użyty |
table_name |
1000 |
261072 KB |
199672 KB |
16 KB |
61384 ZMNIEJSZYĆ |
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".