Когда мне следует перестраивать индексы в моей реляционной базе данных (SQL Server)?
Есть ли основания для перестройки индексов на регулярной основе?
sql-server
index-maintenance
Ник Чаммас
источник
источник
Ответы:
Риск быть слишком общим в моем ответе, я скажу, что вы должны регулярно выполнять процесс обслуживания индекса. Тем не менее, ваш процесс обслуживания индекса должен только перестроить / реорганизовать индексы, которые конкретно в этом нуждаются.
В связи с этим возникает вопрос: когда индекс требует перестройки или реорганизации? Роландо хорошо это затронул. Опять же, я рискую быть чрезвычайно широким. Индекс требует обслуживания, когда уровень фрагментации отрицательно влияет на производительность. Этот уровень фрагментации может варьироваться в зависимости от размера и состава индекса.
Говоря о SQL Server, я склонен выбирать размер индекса и уровень фрагментации индекса, после чего я начинаю выполнять обслуживание индекса. Если индекс содержит менее 100 страниц, я не буду выполнять обслуживание.
Если индекс от 10% до 30% фрагментирован, я буду
REORGANIZE
индексировать иUPDATE
статистику. Если индекс фрагментирован более чем на 30%, я будуREBUILD
индексировать - нетUPDATE STATISTICS
, так как об этом позаботитсяREBUILD
. Помните, однако, что пересборка обновляет только объект статистики, непосредственно связанный с индексом. Другие столбцы статистики необходимо будет поддерживать отдельно.Этот ответ на самом деле очень далек от того, чтобы сказать: да, вы должны выполнять обычное обслуживание индексов, но только для тех индексов, которые в этом нуждаются.
источник
Вы должны перестраивать индексы, когда они становятся сильно фрагментированными специальными событиями. Например, вы выполняете большую массовую загрузку данных в индексированную таблицу.
Так что, если ваши индексы становятся фрагментированными из-за регулярной активности? Должны ли вы запланировать регулярные перестройки? Как часто они должны бежать?
Tom Kyte в этой классической теме Ask Tom рекомендует:
Логика здесь здравая, но она смещена в сторону профиля с высокой нагрузкой на чтение.
«Толстый» индекс (т. Е. Индекс с большим количеством пробелов) действительно оставляет достаточно места для новых и перемещенных строк, тем самым сокращая разбиение страниц и поддерживая скорость записи. Однако, когда вы читаете из этого толстого индекса, вам придется читать больше страниц, чтобы получить те же данные, потому что вы теперь просматриваете больше пустого пространства. Это замедляет ваше чтение.
Таким образом, в базах данных с большим объемом чтения вы хотите регулярно перестраивать или реорганизовывать свои индексы. (Как часто и при каких условиях? У Matt M уже есть конкретный ответ на этот вопрос.) В базах данных, которые выполняют примерно одинаковые операции чтения и записи, или в базах данных с интенсивной записью, вы, вероятно, наносите ущерб производительности вашей базы данных, перестраивая индексы регулярно.
источник
Большинство людей перестраивают их на регулярной основе, чтобы они никогда не разбирались на фрагменты. Необходимость их восстановления зависит от того, насколько быстро они будут фрагментированы. Некоторые индексы нужно будет часто перестраивать, другие в основном никогда. Посмотрите на сценарий, который SQLFool собрал, который обрабатывает многое для вас.
источник
Как отмечается в принятом ответе от Мэтта М, общее практическое правило заключается в том, что индексы, которые фрагментированы более чем на 30%, должны быть перестроены.
Этот запрос поможет вам определить, сколько у вас индексов, которые фрагментированы более чем на 30% (если они у вас есть, вы должны перестроить их):
источник
При фрагментации индекса процент составляет более 30%.
Такого случая не существует, но в целом выполнение обслуживания индекса один раз в неделю в выходные дни является наилучшей практикой для поддержания стабильности среды.
Я бы порекомендовал использовать сценарии обслуживания от Ola Hallengren (лучшие сценарии обслуживания), настроить сценарии в соответствии с вашей средой и запланировать их запуск в выходные.
https://ola.hallengren.com/
Примечание. Пожалуйста, не забудьте обновить статистику после перестроения индексов, потому что перестроение индексов не обновляет всю статистику.
источник
Как и в большинстве вещей в ИТ, это зависит. Какую проблему вы пытаетесь решить, перестраивая индексы? Можете ли вы показать, что это действительно решает проблему? Если это так, то изменяйте цифры, пока не найдете наименьшее количество обслуживания, необходимого для решения проблемы.
Если это не решает проблему или причина, по которой вы это делаете, это просто успокаиваете какую-то метрику, которую вы отслеживаете, потому что это может улучшить ситуацию, тогда все, что вы делаете - это сжигание процессора и ввода-вывода и, возможно, усугубление вашей проблемы.
Существует аргумент, что исправление фрагментации не будет иметь никакого значения для вашего сервера, так стоит ли вообще делать это регулярно?
https://www.brentozar.com/archive/2017/12/index-maintenance-madness/
http://brentozar.com/go/defrag
источник