Таблица изменения SQL Server для изменения TEXT на NVARCHAR (MAX), значительно увеличивая размер базы данных

8

Мне нужно обновить базу данных SQL Server размером около 18 ГБ, чтобы изменить значительное количество TEXTстолбцов NVARCHAR(MAX).

Проблема, с которой я столкнулся, заключается в том, что после выполнения всех alter tableкоманд размер базы данных достигает почти 26 ГБ. Я понимаю, что использование здесь NVARCHAR(MAX)позволит БД расти медленнее, но есть ли способ предотвратить вздутие живота?

Эйдан Лоулесс
источник
2
О, не создавайте тот же вопрос здесь. Просто отметьте это на SO, и моды перенесут его сюда в одно мгновение :-). Теперь кто-то должен слить / очистить и т. Д.
Мариан
2
База данных больше или журнал очень большой?
Аарон Бертран
Извините, Мариан, теперь понятно ...
Эйдан Лоулесс
Аарон, файл MDF намного больше .... почти на 10 ГБ больше
Эйдан Лоулесс

Ответы:

7

Я ожидаю, что этот пост поможет вам.

http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx

Основные факты:

  • По умолчанию TEXT и NTEXT хранят текстовое значение в структуре LOB
  • По умолчанию NVARCHAR (MAX) сохраняет текстовое значение в структуре таблицы (если оно не превышает 8000 байт)
  • Когда вы изменяете столбец с TEXT / NTEXT на NVARCHAR (MAX), способ хранения данных не изменяется, он обновляет только метаданные таблицы. Структура данных изменяется только при следующем изменении значения. Это можно сделать сразу, запустив что-то вроде этого:

      update mytable set mycolumn1 = mycolumn1
  • Если вы используете настройку параметров таблицы по умолчанию для NVARCHAR (MAX), то данные в вашей таблице будут больше.

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

  • Размер вашей таблицы со временем сократится, если вы будете следовать за оператором alter table оператором update table.

Короче говоря, если вы запустите оператор update, что приведет к изменению хранилища структуры данных, размер вашей базы данных будет меньше, чем ожидалось.

РЕДАКТИРОВАТЬ : Поскольку вы упомянули TEXT, а не NTEXT, ваш выигрыш в космосе будет менее очевидным, чем вы думаете. NTEXT занимает вдвое больше места, чем TEXT, но в то же время следует ожидать, что NVARCHAR (MAX) займет примерно половину пространства, чем NTEXT. По моим подсчетам, вы увидите небольшие изменения по сравнению с исходным размером базы данных.


Специальный кредит для http://www.douglubey.com/

РОКА
источник
2
Не могли бы вы обобщить здесь важные факты, в случае, если ссылка может стать мертвой.
Стефан Роллан
Как упоминалось в других ответах, TEXT против NTEXT будет влиять на хранилище, но не так сильно, как вы предлагали.
RoKa
Спасибо ... Я откладывал присоединение уже много лет ... Рад быть здесь.
RoKa
Спасибо RoKA, это существенно изменило пару обсуждаемых таблиц. Я собираюсь восстановить базу данных снова и делать это постепенно, чтобы увидеть результаты. Еще раз спасибо .....
Эйдан Лоулесс
Это мое удовольствие
RoKa
6

Это может быть недосмотр в вашем вопросе, но вы говорите TEXT для NVARCHAR (макс.), А не NTEXT для NVARCHAR (макс.). Если это то, что вы действительно делаете, вы переходите с ANSI на UNICODE, и вы не должны удивляться, что это занимает больше места (однобайтовые символы или многобайтовые символы).

spaghettidba
источник
Да, это то, что я делаю ... хотя, основываясь на некоторых простых расчетах, это не будет учитывать размер увеличения.
Эйдан Лоулесс
2
Вы пробовали с предложением RoKa?
Спагеттидба
1
@AidanLawless, что это за расчеты? Размер базы данных должен увеличиться как минимум на размер существующего TEXTполя - переход на юникод занимает ровно вдвое больше места для хранения ANSI.
JNK
2
@JNK ... если не использовать сжатие в 2008 R2 или выше, где сжатие Unicode будет обрабатывать символы ASCII, хранящиеся в NVARCHAR, как VARCHAR.
Аарон Бертран