Я поддерживаю базу данных SQL Server 2005, на которой хранится приблизительно 2,9 ТБ данных (2 x 1,45 ТБ - у меня есть схема RAW и схема АНАЛИЗ, поэтому в основном две загруженные копии данных). Модель восстановления проста и .ldf
находится на 6Gb.
По какой-то причине, .mdf
это 7,5 ТБ. Теперь в таблицах АНАЛИЗ может быть только 2-3 дополнительных столбца и не так много NVARCHAR(MAX)
столбцов, которые, как я (возможно, ошибочно понял - пожалуйста, исправьте меня, если я ошибаюсь), могут вызывать дополнительное выделение пространства. Это после сокращения базы данных только сейчас - до этого было ~ 9Tb. Есть предположения?
И, пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы - я очень плохо знаком с администрированием и оптимизацией баз данных (обычно я не выполняю эту часть работы :)).
Большое спасибо!
Андрия
источник
Ответы:
В своих оценках размера вы учли количество места, занимаемое индексами? Кроме того, если у вас есть текстовые поля, которые заданы как многобайтовые (
N[VAR]CHAR
а не[VAR]CHAR
), а входные файлы имеют формат UTF-8 или обычный однобайтовый символ, то это увеличит ваши требования к хранилищу почти в два раза. Кроме того, помните, что если у вас есть кластеризованный ключ / индекс в таблице, размер этого параметра влияет на все остальные индексы в таблице, потому что они включают значение кластеризованного ключа для каждой строки (поэтому приведем крайний пример, если в таблице есть NCHAR (10). ) ключ, в котором будет использоваться INT, и это ваш кластеризованный ключ / индекс: вы не только используете дополнительные 16 байтов на строку на страницах данных, вы также тратите 16 байтов на строку в каждом другом индексе этой таблицы ) .Кроме того, некоторое пространство будет выделено, но неиспользовано, либо потому, что механизм БД оставил некоторое пространство, выделенное после удаления, чтобы его можно было быстро снова использовать для новых данных в этой таблице, либо потому, что шаблон вставок и удалений оставил многие страницы только частью полный.
Вы можете запустить:
чтобы быстро взглянуть на то, какие таблицы занимают место.
Также
EXEC sp_spaceused
запуск в этой БД вернет два набора результатов. Первый перечисляет общее пространство, выделенное в файловой системе для файлов данных, и сколько из этого нераспределенного, второй перечисляет, сколько выделенного пространства используется для страниц данных, страниц индекса или в настоящее время не используется.sp_spaceused
вернет пространство, используемое данным объектом, так что вы можете зациклить это, чтобы построить таблицу для анализа:Приведенный выше код выведет все размеры таблиц в одном списке плюс одна строка для итогов. При необходимости вы можете использовать различные системные представления (как
sys.objects
иsys.dm_db_partition_stats
в первом запросе выше, см. Http://technet.microsoft.com/en-us/library/ms177862.aspx для получения более подробной информации), чтобы получить более подробную информацию, такую как пространство, используемое каждым индексом.В файле данных есть три класса неиспользуемого пространства:
sp_spaceused
без указанного объекта)sp_spaceused
выходных данных).Еще одна оговорка здесь, большие объекты (
TEXT
столбцы,[N]VARCHAR(MAX)
значения выше определенного размера и т. д.) поскольку они размещаются вне страницы, просто беря 8 байтов в данных основной строки для хранения указателя на данные в другом месте), что может нарушить ограничение 8192 байта на строку.tl; dr: оценка ожидаемых размеров базы данных может быть гораздо более сложной, чем это изначально предполагалось.
источник
Попробуйте запустить
sp_spaceused
свою базу данных. В качестве примера возвращается:Чтобы запустить его в базе данных, просто
USE
запустите базу данныхsp_spaceused
.Если он все еще показывает много неиспользуемого пространства, вы можете попробовать снова сжать. Иногда я нахожу, что это требует нескольких попыток. Также иногда я считаю, что лучше всего сжимать отдельный файл, а не базу данных в целом. Однако вы можете обнаружить, что у вас есть 2,9 ТБ данных и еще 4 + ТБ индексов, и в этом случае 7,5 ТБ вполне разумны. Если вы хотите почувствовать объем пространства (данные и индекс) каждой таблицы, вы также можете запустить ее
sp_spaceused
на уровне таблицы. Вы можете запустить его для всех таблиц в базе данных, используя следующую команду:Хотя справедливое предупреждение sp_msforeachtable недокументировано, не поддерживается и, как известно, пропускает таблицы. С другой стороны, мне самому повезло с этим.
Все это говорит о том, что ваша база данных ДОЛЖНА иметь определенный процент свободного пространства в зависимости от вашего ожидаемого роста. По сути, вы хотите убедиться, что у вас есть место для роста от 6 месяцев до пары лет. Также вы захотите проверить свои
autogrowth
настройки, чтобы убедиться, что они соответствуют вашей ситуации. В частности, учитывая размер вашей базы данных, вы НЕ хотите использовать%autogrowth
.источник
Используя SQL Management Studio, 1. Щелкните правой кнопкой мыши на базе данных, затем 2. Нажмите «Задачи» -> «Сжать» -> «Файлы».
Вы увидите диалоговое окно, которое показывает: В настоящее время выделенное пространство б. Доступное свободное пространство + (% свободного)
Если ваш% Free превышает 50%, вы можете рассмотреть возможность сжатия файла. Я видел этот удар целых 90%. Если я решаю сжать файл, я обычно устанавливаю его на 2 или 3 гигабайта больше, чем текущее выделенное пространство. Большинство моих баз данных меньше 50 гигов. Так что, если у вас гораздо больший файл, вы можете сделать его размером 10 гигов. Я обычно беспокоюсь только об уменьшении, если я собираюсь переместить базу данных на другой сервер, вы можете прочитать все о проблемах сокращения на любой странице sql.
источник