Как уменьшить размер MSSQL Express базы?
не знаю правда, возможно ли это в экспрессе, хотя было бы странно, если нет
//post 6666 +)
а что-нибудь типа экспорта, удаления, затем импорта обратно в MSSQL не поможет случайно?
Ситуация следующая: есть некоторая базаГавно какое-то
А логи не смотрел сколько занимают?
dump/restore обычно помогает при такого рода косякахНи на байт размер не поменялся
А логи не смотрел сколько занимают?Пол метра
что показывает exec sp_spaceused?
возможно есть данные которые можно перенести в архив?
а как определяется размер базы?Я файлы смотрю и то, что шринк показывает.
что показывает exec sp_spaceused?
database_name database_size unallocated space
dumptest 3729.38 MB 0.87 MB
reserved data index_size unused
3816392 KB 2936488 KB 763752 KB 116152 KB
возможно есть данные которые можно перенести в архив?Не, сейчас они удаляются, но очень хочется, чтобы хотя бы побольше хранились данные
Странно что шринк совсем нисколько не помог?
а как ты его делаешь?
dbcc shrinkdatabase (dumptest ,10) вообще нисколько не помогает?
какой тип данных для поля, где были уменьшены строки?
text
Странно что шринк совсем нисколько не помог?Я делаю его из ManagementStudio (правый клик на базе -> Tasks -> Shrink там же показывается сколько места занимает база и файлы и сколько можно освбодить. Соответственно, я делаю так: беру исходную базу, смотрю, сколько шринк может освободить и текущий размер, накатываю свой апдейт, снова смотрю, что шринк показывает - все остается то же самое. Пробовал запускать шринк - получалось то, что он и предсказывал.
а как ты его делаешь?
dbcc shrinkdatabase (dumptest ,10) вообще нисколько не помогает?
накатываю свой апдейта что это? поподробнее, можно?
честно говоря не очень понял, что ты сделал, когда получил как бы 500 метров дополнительного места.
У меня есть текстовая колонка. Я выполняю обновление части строк из этой колонки так, что их длина уменьшается (функция DATALENGTH возвращает меньшее значение). Если просуммировать все разности длин старых значений и новых по всей таблице, то получается значение 500,000,000. Вот можно ли эту разницу отобрать обратно у сервера, т.к. реальный размер базы не изменяется после такого обновления?
Я делаю его из ManagementStudio (правый клик на базе -> Tasks -> Shrink там же показывается сколько места занимает база и файлы и сколько можно освбодить. Соответственно, я делаю так: беру исходную базу, смотрю, сколько шринк может освободить и текущий размер, накатываю свой апдейт, снова смотрю, что шринк показывает - все остается то же самое. Пробовал запускать шринк - получалось то, что он и предсказывал.Я не очень знаком с MSSQL, но думаю там всё примерно так же.
Таблица занимает некоторые сегменты/блоки в базе, при удалении/изменении данных высвобождается место в сегментах/блоках, но для БД они всё-равно всё ещё заняты этой таблицей.
Соответственно тебе нужно отобрать это место у таблицы и вернуть в БД.
Для этого есть несколько методов:
1. Самый надёжный. Создать ещё одну таблицу и скопировать данные туда, новая таблица займёт места ровно столько сколько нужно.
2. Возможно поможет DBCC CLEANTABLE
Для этого есть несколько методов:Ага, но думал, что можно без этого как-нибудь обойтись, т.к. геморно все это.
1. Самый надёжный. Создать ещё одну таблицу и скопировать данные туда, новая таблица займёт места ровно столько сколько нужно.
2. Возможно поможет DBCC CLEANTABLEНе помогло. MSDN и не обещает, что эта штука поможет:
Освобождает место на диске, занятое удаленными из таблиц столбцами переменной длины или индексированными представлениями.
Т.е., на сколько я понял, нужно удалять записи, а я ничего не удалял.
ЗЫ. Вроде, почти уговорил обновить версию сервака - в последнем экспрессе база может быть 10 гигов, поэтому проблема снимется.
обновить версию сервака - в последнем экспрессе база может быть 10 гиговпохоже самое разумное решение.
Т.е., на сколько я понял, нужно удалять записи, а я ничего не удалял.Нужно удалять колонки.
Я перечитал по внимательней, я думал ты создавал новую колонку, а ты оказывается обновлял старую.
Тогда такое решение:
1. добавить новую колонку того же типа
2. Перелить туда данные
3. Удалить старую
4. CLEANTABLE
Кстати, хорошая мысль - завтра попробую. Это должно быть гораздо проще, чем всю таблицу пересоздавать. Только здесь может быть проблема: влезут ли две колонки в базу? Она ж уже почти впритык.
А ограничение в 4Гб это на одну базу или на все базы под управлением данного экземпляра?
Пишут, что DB size
Тогда чего ты паришься — вынеси табличку в отдельную БД а в этой создай представление или если хочешь верни потом обратно.
Оставить комментарий
agent007new
Ситуация следующая: есть некоторая база, в которой куча записей типа text. Ее размер начал подходить к верхнему пределу для express, поэтому, для освобождения места, часть полей была проапдейчена так, что их суммарная длина уменьшилась на 500 метров. Но размер базы, естественно, не изменился, попробовал сделать шринк - он тоже не нашел эти 500 метров. Нашел в инете, что при всяких подобных изменениях неплохо перестраивать индексы для освобождения места, но эти текстовые поля в индексах не участвуют (вот с clustered index я не очень понял - в нем только ключевые колонки или все-таки все - т.е. есть ли смысл его перестраивать?). Как вариант, наверное, можно было бы создать новую таблицу и вставить туда все это заново, но размер базы уже близок к пределу и, наверное, еще одну большую таблицу не дадут создать, плюс там еще куча всяких других сущностей (индексы, триггеры и прочая которые геморно будет переносить. Теперь вопрос: можно ли мне добыть это освободившееся место?