Восстановление свободного места в файловой группе с одним хронологическим разделом
Переехал сюда из ТАК (там никаких комментариев)
Вопрос:
Как правильно восстановить пространство в большой (сотни ГБ) файловой группе с одним разделом таблицы, который упорядочен в хронологическом порядке и не имеет фрагментации индекса и не может позволить себе фрагментации индекса? Я много слышу о сокращении (например, http://www.brentozar.com/archive/2009/08/stop-shrinking-your-database-files-seriously-now/). Фрагментация индекса и временная сложность перестройки - моя главная задача
Фон:
У меня есть огромная таблица (несколько ТБ), которая имеет следующие свойства:
- данные хранятся только в хронологическом порядке (столбец "C")
- Индекс основан на измерении "А", а затем столбец "С"
- таблица разделена на основе 'A', каждый раздел имеет свою собственную файловую группу (с 10% FileGrowth)
Таким образом, данные добавляются только к каждому разделу, и хранение работает очень быстро.
Мы хотим начать раздел также на основе времени (например, раздел на квартал и измерение "A"; снова каждый раздел в отдельной файловой группе). Но есть две проблемы:
- Мы не можем позволить себе тратить впустую дисковое пространство (например, иметь 10% свободного пространства в каждом историческом разделе, который никогда не будет затронут снова).
- Мы не можем абсолютно позволить себе какую-либо фрагментацию индекса (так как при таком количестве данных наши запросы сильно пострадают).
Было бы неплохо иметь возможность просто вырезать свободное пространство из конца файловой группы после каждого конца квартала, а затем, например, пометить файловую группу как доступную только для чтения.
1 ответ
Для освобождения свободного места в конце раздела:
DBCC SHRINKFILE (FileGroupFileName, TRUNCATEONLY)
GO
Для маркировки раздела только для чтения:
ALTER DATABASE [DBNAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [DBNAME] MODIFY FILEGROUP [FileGroupName] READ_ONLY;
GO
ALTER DATABASE [DBNAME]
SET MULTI_USER;
GO