SQL Server не используется, но выделено табличное пространство

У меня есть MS SQL базы данных, которые становятся очень большими. При осмотре я обнаружил, что в некоторых таблицах есть куча неиспользуемого пространства. Я не делаю много физических удалений, поэтому я не думаю, что это просто удаленные записи. DBCC SHRINK не уменьшает размер файла. Но если я перенесу таблицу в новую пустую базу данных, размер уменьшится примерно на 80%. Вместо 7 ГБ, которые есть в этой таблице в текущей базе данных, я получаю около 1,5 ГБ в новой базе данных. Как будто сервер sql выделяет слишком много памяти. Кто-нибудь сталкивался с этим раньше? Я хотел бы иметь возможность уменьшить таблицу, удалив неиспользуемое выделенное пространство без необходимости создания совершенно новой базы данных.

Дополнительная информация:

Модель полного восстановления используется. Я попробую перестроить индексы, я думаю, это было какое-то время. ldf сокращаются ежедневно, используя какой-то дурацкий хранимый процесс, который их усекает.

6 ответов

Я обнаружил, что если вы не позаботитесь о резервном копировании вашего файла журнала транзакций (LDF), вы получите нечто подобное. Я не могу не подчеркнуть важность наличия хорошего резервного "гигиены". Мало того, что это спасет ваш бекон, если что-то пойдет не так, но я также помогу поддерживать хорошую базу данных

Я не делаю много физических удалений

как насчет обновлений таблицы, каков уровень фрагментации. запустите DBCC SHOWCONTIG, затем перестройте индекс, если он сильно фрагментирован. После этого выполните BACKUP LOG WITH TRUNCATE_ONLY, а затем команду SHRINK.

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

Щелкните правой кнопкой мыши по таблице в SQL Manager и выберите SCRIPT TABLE. Тогда посмотрите, если PAD_INDEX=OFF, Если PAD_INDEX используется, вероятно, там, где стол занимает место.

Это работало для меня в прошлом

USE [DBNAME]
GO

DBCC SHRINKFILE (N'FILENAME' , 0, TRUNCATEONLY)

GO

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

В опциях вы можете указать, на сколько вы хотите вырасти. По умолчанию я считаю, что это 10%, поэтому, учитывая базу данных объемом 200 МБ, при заполнении последней страницы она выделит еще 20 МБ пространства страницы. На 7 ГБ это выделит 700 МБ.

Я не знаю точно, где вы можете изменить его после создания БД, но я знаю, что он есть, когда вы создаете БД. Небольшая работа в Google, скорее всего, покажет вам ответ.

ПРИМЕЧАНИЕ: мой ответ не в том, как это исправить, а в том, как предотвратить / объяснить, почему вы можете увидеть все это нераспределенное пространство.

Другие вопросы по тегам