Когда нужно перестроить индексы?

Когда мне нужно перестроить индексы в моей реляционной базе данных (SQL Server)?

Есть ли случай для восстановления индексов на регулярной основе?

46 голосов | спросил Nick Chammas 3 PM000000100000005331 2011, 22:43:53

6 ответов


35

рискуя быть слишком общим в своем ответе, я скажу, что вы должны регулярно запускать процесс обслуживания индексов. Тем не менее, процесс обслуживания индекса должен только восстанавливать /реорганизовывать индексы, которые его специально требуют.

Возникает вопрос: когда требуется перестроить или реорганизовать индекс? Роландо это хорошо коснулся. Опять же, я рискую быть чрезвычайно широким. Индекс требует обслуживания, когда уровень фрагментации отрицательно влияет на производительность. Этот уровень фрагментации может варьироваться в зависимости от размера и состава индекса.

Говоря о SQL Server, я склонен выбирать уровень индекса и индекс фрагментации, с которого я начинаю выполнять обслуживание индекса. Если индекс содержит менее 100 страниц, я не буду выполнять техническое обслуживание.

Если индекс от 10% до 30% фрагментирован, я буду REORGANIZE индексировать и UPDATE статистику. Если индекс более 30% фрагментирован, я буду REBUILD индексировать - без UPDATE STATISTICS , так как об этом заботится REBUILD , Помните, однако, что перестройка только обновляет объект статистики, напрямую связанный с индексом. Другая статистика столбцов должна поддерживаться отдельно.

Этот ответ на самом деле может быть длинным способом: Да, вы должны выполнять рутинное обслуживание индекса, но только по индексам, которые ему нужны.

ответил Matt M 3 PM000000110000002931 2011, 23:31:29
18
  

Когда мне нужно перестроить индексы в моей реляционной базе данных (например, SQL Server)?

Вы должны перестроить индексы, когда они становятся сильно фрагментированными по специальным событиям. Например, вы выполняете большую объемную загрузку данных в индексированную таблицу.

  

Есть ли случай для восстановления индексов на регулярной основе?

Итак, что, если ваши индексы становятся фрагментированными на регулярной основе из-за регулярной активности? Должны ли вы планировать регулярные перестройки? Как часто они должны выполняться?

Tom Kyte , в этом классический Ask Tom thread , рекомендует:

  

Временная задержка между индексами перестроек должна быть приблизительно на FOREVER.

     

...

     

Не знаю, как сказать это лучше - индекс хочет быть большим и жирным с лишним пространством. Он находится в столбце, который вы обновляете, - перемещая индексную запись с места на место в индекс. Однажды строка имеет код «А», на следующий день код «G», затем «Z», затем «H» и т. Д. Таким образом, индексная строка для строки перемещается с места на место в индексе. Так как это так, ему нужно пространство - будет, если пространства там нет, мы разделим блок на два - и создадим пространство. Теперь индекс становится толстым. Со временем индекс составляет 2-3 раза по размеру, когда вы начали, и «половина или более пустая». Но это нормально, так как вы перемещаете строки вокруг. Теперь, когда мы перемещаем ряды вокруг, нам больше не нужно разделять блоки, чтобы освободить место - комната уже доступна.

     

Затем вы приходите и восстанавливаете или отбрасываете и воссоздаете индекс (который имеет одни и те же эффекты - только перестройка «безопаснее») - не имеет шанса потерять индекс и может быть быстрее, поскольку индекс может быть перестроен путем сканирования существующего индекса вместо сканирования таблицы и сортировки и построения нового индекса). Теперь все хорошее место исчезло. Мы начинаем процесс разбивки блоков снова и снова - возвращаясь к тому, с чего мы начали.

     

Вы не сохранили место.

     

Индекс возвращается обратно так, как он был.

     

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

Логика здесь звуковая, но она смещена против профиля нагрузки с высокой нагрузкой.

Индекс «жир» (т. е. один с большим количеством пробелов) действительно сохраняет достаточное количество места для новых и перемещенных строк, тем самым уменьшая разбиение страниц и сохраняя скорость записи. Однако, когда вы читаете этот индекс жира, вам нужно будет прочитать больше страниц, чтобы получить одни и те же данные, потому что теперь вы просеиваете более пустое пространство. Это замедляет чтение.

Итак, в базах данных с чтением вы хотите регулярно перестраивать или реорганизовывать свои индексы. (Как часто и при каких условиях? Мэтт М уже имеет конкретный ответ к этому вопросу.) В базах данных, которые имеют примерно эквивалентную активность чтения и записи или в базах данных, которые сильно зависят от записи, вы, вероятно, повредите производительность своей базы данных, регулярно обновляя индексы.

ответил Nick Chammas 4 AM00000090000000431 2011, 09:56:04
9

Большинство людей регулярно перестраивают их, чтобы они никогда не доходили до фрагментации. Когда вам нужно перестроить их, это зависит от того, насколько быстро они становятся фрагментированными. Некоторые индексы нужно будет перестраивать часто, другие в принципе никогда. Ознакомьтесь с скриптом SQLFool , который объединяет много способов понять этот материал для вас.

ответил mrdenny 3 PM000000100000005531 2011, 22:51:55
3
  

Когда мне нужно перестроить индексы?

Когда процент фрагментации индекса составляет более 30%.

  

Есть ли случай для восстановления индексов на регулярной основе?

Нет такого случая, но в целом, делая Индексное обслуживание один раз в неделю, в течение выходных - это лучшая практика для сохранения стабильности среды.

Я бы рекомендовал использовать сценарии обслуживания от Ola Hallengren (лучшие сценарии обслуживания), настроить сценарии на основе вашей среды и запланировать их запуск в выходные.

https://ola.hallengren.com/

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

ответил KrishnaV 20 MarpmFri, 20 Mar 2015 17:53:46 +03002015-03-20T17:53:46+03:0005 2015, 17:53:46
0

Как отмечено в принятом ответе Мэтта М, общее правило состоит в том, что индексы, которые более 30% фрагментированы, должны быть перестроены.

Этот запрос поможет вам узнать, сколько индексов у вас более 30% фрагментировано (когда у вас их есть, вы должны их перестроить):

  SELECT DB_NAME () AS DBName,
       OBJECT_NAME (ind.object_id) AS TableName,
       ind.name AS IndexName,
       indexstats.index_type_desc AS IndexType,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages,
       Строки SUM (p.rows) AS
  FROM sys.dm_db_index_physical_stats (DB_ID (), NULL, NULL, NULL, NULL) AS indexstats
         INNER JOIN sys.indexes AS ind ON (ind.object_id = indexstats.object_id
                                           AND ind.index_id = indexstats.index_id)
         INNER JOIN sys.partitions AS p ON (ind.object_id = p.object_id
                                            AND ind.index_id = p.index_id)
 WHERE indexstats.avg_fragmentation_in_percent> 30
 ГРУППА ПО
       ИМЯ_ОБЪЕКТА (ind.object_id),
       ind.name,
       indexstats.index_type_desc,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages
 ORDER BY indexstats.avg_fragmentation_in_percent DESC
 
ответил amandamaddox3 15 FriEurope/Moscow2017-12-15T00:13:30+03:00Europe/Moscow12bEurope/MoscowFri, 15 Dec 2017 00:13:30 +0300 2017, 00:13:30
0

Как и большинство вещей в ИТ, это зависит. Какую проблему вы пытаетесь исправить, перестраивая индексы? Можете ли вы показать, что это действительно устраняет проблему? Если это так, то настройте цифры, пока не найдете наименьшее количество обслуживания, которое необходимо сделать для устранения проблемы.

Если проблема не устранена или причина, по которой вы это делаете, это просто успокоить некоторую метрику, которую вы контролируете, потому что она может улучшить ситуацию, тогда все, что вы делаете, это сжигание CPU и ввода-вывода и, возможно, хуже.

Есть аргумент, что исправление фрагментации не будет иметь никакого значения для вашего сервера, так что стоит ли вообще делать это регулярно?

https://www.brentozar.com/archive/2017/12 /индекс-техническое обслуживание безумие /

http://brentozar.com/go/defrag

ответил Greg 15 FriEurope/Moscow2017-12-15T09:36:43+03:00Europe/Moscow12bEurope/MoscowFri, 15 Dec 2017 09:36:43 +0300 2017, 09:36:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132