Автоматическое уменьшение размера базы данных происходит в том случае, когда сервер обнаруживает в базе данных слишком много неиспользуемого пространства.
Несмотря на некоторые недостатки автоматического уменьшения размера базы данных, нельзя не отметить и неоспоримое преимущество — администратор освобождается от необходимости следить за размером базы данных, а также за объемом используемого и свободного пространства, переложив эту обязанность на сервер.
Для разрешения или запрещения автоматического уменьшения базы данных используется хранимая процедура sp_dboption:
sp_dboption "database_name", "autoshrink". ("true" | "false")
С помощью первого аргумента указывается имя базы данных, свойства которой предполагается изменять. Второй аргумент должен оставаться таким, как он приведен выше. Указывая значение "true" или " f al se", можно соответственно разрешать и запрещать автоматическое уменьшение файлов базы данных.
Автоматическое уменьшение размера базы данных можно разрешить и с помощью команды ALTER DATABASE, воспользовавшись аргументом SET. Более подробно управление свойствами базы данных будет рассмотрено в следующем разделе.
Помимо автоматического можно также выполнять ручное уменьшение размера базы данных. Это делается с помощью команды контроля согласованности (или целостности) базы данных (database consistency check, DBCC):
DBCC SHRINKDATABASE
( databasejname [ , target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)
Рассмотрим назначение аргументов.
О database_name. Имя базы данных, которую необходимо сжать.
О target_percent. Количество процентов свободного пространства, которое желательно оставить в базе данных после выполнения ее сжатия. Говоря точнее, с помощью рассматриваемого аргумента указывается процент от общего объема файлов базы данных, который должен быть незаполненным. Например, если в файле размером 10 Мбайт имеется 4 Мбайта свободного пространства, то для уменьшения количества неиспользуемого пространства до 2 Мбайт необходимо указать значение аргумента target_percent равным 25. Сначала сервер вычисляет объем свободного и занятого пространства (соответственно 4 и 6 Мбайт). Чтобы получить искомые 25 процентов, соотношение свободного и занятого пространства должно быть 3 к 1. Путем нехитрых вычислений сервер приходит к выводу, что нужный результат будет получен при размере файла, равном 8 Мбайт. После этого сервер переносит все данные из последних 2 Мбайт файла в первые 8 Мбайт, помещая их в любое незанятое место на странице. После того как все данные будут перенесены, выполняется уменьшение размера файла. Заметим, что в аргументе target_percent нельзя указывать размер, превышающий текущий процент свободного пространства. В противном случае уменьшение размера файла выполнено не будет. Таким образом, выполняя команду DBCC SHRINKDATABASE
г со слишком большим значением аргумента target_percent, можно получить ситуацию, когда уменьшения размера базы данных вообще не происходит.
О NOTRUNCATE. При задании этого аргумента свободное пространство не возвращается операционной системе, а резервируется в файлах для будущего использования, то есть физически уменьшения размера базы данных не происходит. Тем не менее, сервер все же выполняет перенос данных в начало файла, как это было описано для предыдущего аргумента.
О TRUNCATEONLY. При задании этого аргумента сервер удаляет все свободное пространство в файле за последним используемым экстентом. Значение аргумента target_percent при этом игнорируется. Не предпринимается никакой попытки перемещения данных для более эффективного их распределения в файле. Если в файле размером 2 Мбайт выделено всего два экстента в начале и в середине файла, то при использовании команды DBCC SHRINKDATABASE будет освобождена только половина файла, начиная от второго экстента и до конца файла. Размер файла будет составлять около 1 Мбайт, хотя в принципе он мог быть уменьшен до 128 Кбайт.