Уменьшенный размер строки в SQL не уменьшил размер таблицы - PullRequest
2 голосов
/ 04 апреля 2011

Может кто-нибудь объяснить какое-то поведение, которое я наблюдаю в SQL Server 2005?

Мне было поручено уменьшить размер или нашу БД.

Таблица содержит почти 6 миллионов записей,и я рассчитал размер строки как 1990 байт.Я взял копию таблицы и уменьшил размер строки до 803 байт с помощью различных методов.

Когда я сравниваю Размер данных исходной таблицы (свойства правой кнопки мыши или sp_spaceused) с новой таблицей I 'Я вижу экономию всего 21,7 МБ.Это далеко не то, что я ожидал.

Вот как я рассчитал размер строки: если столбец был числовым / десятичным, то я использовал размер MSDN (http://msdn.microsoft.com/en-us/library/ms187746.aspx), для всего остального, что я использовал syscolumns.lengthЕсли столбец обнулялся, я добавил дополнительный байт.

Вот некоторые из внесенных мною изменений.

  1. Превратил ненужные nvarchars в varchars
  2. Сделал столбцы НЕNULL
  3. Уменьшена максимальная длина столбцов varchar для соответствия фактическим данным
  4. Удалены некоторые неиспользуемые столбцы
  5. Пары datetime в smalldatetime
  6. Превратили несколько десятичных знаков в целые.
  7. Слияние 16 пустых столбцов BIT в немного замаскированный int.

Исходя из этого, мои расчеты показали уменьшение размера строки на 60%, а по сравнению с таблицей строк 6M я ожидал бы больше, чемЭкономия 21 МБ. Она уменьшилась с 2 762 536 КБ до 2 740 816 КБ.

Может кто-нибудь объяснить мне это поведение?

ps Это не учитывает никаких индексов.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Проблема в том, что изменение таблицы не освобождает место. Удаление столбца логично, столбец скрыт , не удален. Изменение типа столбца часто приводит к добавлению нового столбца и скрытию предыдущего. Все эти операции увеличивают физический размер таблицы. Чтобы освободить место «по-настоящему», вам нужно восстановить таблицу. В SQL 2008 и более поздних версиях вы бы выдавали ALTER TABLE ... REBUILD. В SQL 2005 вы можете выдать DBCC REINDEX(table).

0 голосов
/ 05 апреля 2011

Я думаю, вам нужно перестроить кластерный индекс в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...