2009-06-05 3 views
3

У меня есть большая таблица в SQL Server 2005, которая занимает около 3,5 ГБ пространства (согласно sp_spaceused). Он содержит 10 миллионов записей и несколько индексов.SQL Server 2005: дисковое пространство, занятое сброшенными столбцами

Я просто сбросил с него кучу столбцов, так что длина записи уменьшилась до половины, и, к моему удивлению, для этого потребовалось нулевое время. Очевидно, что sp_spaceused все еще сообщал о том же занятом пространстве, что SQL-сервер ничего не делал при удалении столбцов, кроме того, что они помечены как «отброшенные».

Таким образом, я переместил все данные из этой таблицы в другую новую таблицу, усекал ее и переместил все данные назад, чтобы получить все реконструированные.

Теперь данные берут 2,8 ГБ, что меньше, чем раньше, но я ожидал большего падения.

Возможно ли, что тот факт, что эта таблица первоначально имела эти столбцы, все еще оставляет что-то там?

Усекали его недостаточно? Должен ли я сбросить его и создать его снова с меньшим набором столбцов?

Или данные действительно принимают 2,8 ГБ?

Спасибо!

ответ

2

Как вы подсчитали, что «ожидается большее падение»? Обратите внимание, что данные поступают на 8K страниц, а это означает, что даже если отдельные строки меньше, это не всегда означает, что вам нужно меньше страниц для их хранения. Например (пример), если ваши ряды имели размер 7.5K каждый, только одна строка на странице соответствовала бы. Вы бросаете несколько столбцов, ваша строка - 5K, но все же это одна строка на странице.

4

Вам нужно будет перестроить кластеризованный индекс (если у вас его есть - по умолчанию ваш первичный ключ - кластеризованный ключ).

ALTER INDEX (your clustered index) ON TABLE (your table) REBUILD 

данные действительно уровень листьев вашего кластерного индекса - как только вы восстановить его, то это будет «уплотняется» и строки должны быть сохранены на гораздо меньшем количестве страниц данных, уменьшая размер базы данных тоже.

Если это вообще не помогает, вам также может потребоваться запустить DBCC SHRINKDATABASE в вашей базе данных, чтобы действительно освободить пространство. Эти два шага вместе должны действительно получить вам небольшой файл базы данных!

Marc

+0

И только если предположить, что это таблица 3,5 ГБ, эта операция будет в порядке с запущенной системой? – marquito

+1

@marquito: это потребует простоев, чтобы завершить эту операцию - конечно - никоим образом не вокруг. –

+0

спасибо, @marc_s. Поскольку я сталкиваюсь с такой же ситуацией, хорошо знать, что мне придется ждать, чтобы выполнить процедуру или столкнуться с последствиями. :) – marquito