освободить неиспользуемое пространство в SQL Server 2008 - PullRequest
6 голосов
/ 16 февраля 2011

У меня есть таблица с более чем 300 000 записей, размером примерно 1,5 ГБ

В этой таблице у меня три varchar(5000) поля, остальные - маленькие поля.

При выдаче update установите для этих трех полей значение ''.

После сжатия (база данных и файлы) база данных занимает почти то же пространство, что и раньше ...

DBCC SHRINKDATABASE(N'DataBase' )
DBCC SHRINKFILE (N'DataBase' , 1757)
DBCC SHRINKFILE (N'DataBase_log' , 344)

Есть идеи, как освободить это дисковое пространство?

Ответы [ 3 ]

3 голосов
/ 16 февраля 2011

По сути, вам необходимо «переместить» содержимое таблицы из одного места на жестком диске в другое. При таком перемещении SQL будет эффективно «перепаковывать» содержимое страниц. Простая замена 5000 байтов данных на 3 (или 0 и перевернутая нулевая битовая маска) не приведет к тому, что SQL пересмотрит или перезапишет содержимое страниц таблицы.

Если таблица имеет кластеризованный индекс, просто переиндексируйте его (ALTER INDEX ... REBUILD ...) добьются цели.

Если таблица не имеет кластеризованного индекса, вы можете либо создать его, а затем удалить его, либо ВЫБРАТЬ ... В ... новую таблицу, удалить старую таблицу и переименовать новую в исходное имя .

2 голосов
/ 16 февраля 2011

Тот факт, что для столбца установлено значение nil, не означает, что база данных будет переоформлять таблицу.Обновленная запись будет по-прежнему помещаться на той же странице, на которой она размещалась ранее (объем свободного места на странице будет увеличиваться).

Кроме того, вы знаете, не так ли, что varchar (5000) нене означает, что это занимает 5000 октетов?Это переменная длина - префикс длины в два октета, содержащий длину данных поля, за которым следуют октеты данных.Для установки столбца varchar (5000) в строке в 'foobar' потребуется 8 октетов (2 + 6).

Перестройте ваши индексы, включая индекс кластеризации.

Еслиу вас нет кластеризованного индекса, добавьте его.Это заставит реорг стола.Теперь удалите индекс кластеризации.

Теперь, когда вы сжимаете файл данных, вам нужно освободить место на диске.

0 голосов
/ 16 февраля 2011

Мне просто нужно было установить эти поля в null, выполнить сжатие, а затем установить их в ''

, и база данных изменилась с 1,5 ГБ до 115 МБ

довольно странно...

-

Фактически, установив эти поля в Nullable - это означает, что воссоздать всю таблицу - сделал трюк

...