MS-SQL: пространство на перераспределении и воссоздании - PullRequest
0 голосов
/ 05 ноября 2018

нам нужно удалять старые данные из огромной таблицы раз в год. Строки таблицы довольно компактны (около 40 байт), и в таблице есть только кластерный индекс.

Общая база данных составляет около 750 ГБ, а размер таблицы составляет 640 ГБ и содержит 8,7 миллиардов строк перед очисткой. После удаления остается только 3,7 миллиарда строк, размер данных уменьшается примерно до 500 ГБ.

Эти цифры выглядят странно, но они хороши: на каждой странице было удалено несколько строк. Некоторые страницы были освобождены и отброшены, некоторые остались неизменными и все еще заполнены на 100%, но большинство страниц теперь заполнены частично, и на каждой странице много свободного места.

Чтобы освободить это место, мне нужно перестроить индекс. У меня такой вопрос: как дефрагментировать индекс в базе данных, который имеет размер самого индекса?

Если я правильно помню, для INDEX DEFRAG REBUILD потребуется свободное пространство, в 1,3 раза превышающее размер, на котором оно работает, поскольку оно копирует данные отсортированным способом. БД вырастет почти на 1 ТБ, и это новое пространство не понадобится после завершения дефрагментации.

Сжатие после дефрагментации не помогает, поскольку оно приводит к новой (тяжелой) фрагментации.

Мне известно о настройке "SORT_IN_TEMPDB". Есть ли оценка того, сколько свободного места в БД потребуется с этим параметром?

В качестве альтернативы я мог бы удалить и заново создать кластеризованный индекс, но я не уверен, какова потребность в пространстве для этой операции.

Реорганизация индекса не освобождает место на каждой странице (?), Поэтому эта операция тоже не то, что я хочу.

Спасибо за любые идеи! Ralf

1 Ответ

0 голосов
/ 05 ноября 2018

нам нужно удалять старые данные из огромной таблицы раз в год.

Это именно тот случай использования разбиения. Разделение за год, выпадение субтаблицы, сделано. Простои? Миллисекунда, если вы делаете это умно.

...