Почему индекс REBUILD не уменьшает фрагментацию индекса?

30

Я использовал ALTER INDEX REBUILD для удаления фрагментации индекса. В некоторых случаях REBUILD, похоже, не удаляет эту фрагментацию. По каким причинам REBUILD не удаляет фрагментацию? Похоже, это происходит особенно с небольшими показателями.

jrara
источник
Связанный: dba.stackexchange.com/questions/5365/…
Марк Стори-Смит

Ответы:

39

Если индекс очень маленький (я считаю, менее 8 страниц), он будет использовать смешанные экстенты. Следовательно, это будет выглядеть так, как будто осталась фрагментация, так как экстент размещения будет содержать страницы из нескольких индексов.

Из-за этого, а также из-за того факта, что в таком маленьком индексе, что фрагментация обычно пренебрежимо мала, вам действительно нужно перестраивать индексы только с определенным порогом страницы. Рекомендуется перестраивать фрагментированные индексы размером не менее 1000 страниц .

Томас Стрингер
источник
34

Это также может произойти с очень большими индексами.

У меня было несколько индексов в таблице с примерно 700-метровыми строками, которые я не мог дефрагментировать ниже примерно на 30%. Проблема заключалась в том, что в базе данных не было непрерывного свободного пространства для последовательного упорядочения индекса.

Чтобы обойти очень большой индекс, который не будет дефрагментировать, лучшее решение состоит в том, чтобы предварительно изменить размер новой базы данных и переместить все ваши объекты в эту БД, а затем воссоздать ваши индексы там.

JNK
источник
1

Я боролся с этим некоторое время и, как и JNK, думал, что проблема в том, что свободное пространство и физическая фрагментация на диске остаются. Тем не менее, что вы делаете по этому поводу на SSD SAN?

Теперь я обнаружил, что хорошей идеей может быть включение только index_level = 0. Вот как это делается в сценарии Олы Хелленгрен.

Еще одно улучшение, чтобы сделать

 REBUILD With (maxdop = 1)

Таким образом вы обеспечите максимальное улучшение.

vikjon0
источник