Обработка неиспользуемых индексов
Пересказ статьи Chad Callihan. Handling Unused Indexes
Что делать, если вы видите, что индекс обновляется, но с ним мало выполняется операций поиска и сканирования? Следует ли вам удалить его, поскольку к таблице нет запросов, или выбирается лучший индекс? Если индекс не имеет обновлений, поиска или сканирования, нужно ли его тогда удалять?
Ответ на эти вопросы: "Пока нет!" Избавление от индекса, который не так часто используется, кажется простым, но требует тщательного изучения.
Для проверки, что индекс не используется, можно применить следующий скрипт:
Никогда не выполняйте запросы проверки индексов, проверки того, что кажется неиспользуемым, чтобы начать удалять индексы. Информация об использовании индекса не хранится за все время. Даже если вы вернулись в офис после длинных выходных, и конкретный индекс, который вы проверяете, не появился среди используемых, следует, по крайней мере, проверить сначала потенциальные причины этого.
Статистика в dm_db_index_usage_stats сбрасывается при перезапуске SQL Server. Если вы видите очень мало информации в dm_db_index_usage_stats, причиной может быть недавняя перезагрузка сервера для установки патча или из-за другой проблемы, которая привела к перезапуску SQL Server. Это одна из многих причин, почему важно знать расписание перезагрузок сервера.
Возможно, вы проверяете индексы в конце месяца и обнаруживаете индекс, который обновлялся, но не имел сканирований или поиска в нем. Вы решаете отключить его, и уходите домой на выходные. При возвращении в офис вы понимаете, что есть ежемесячное задание, которое полагается на этот индекс, и вся обработка, которую предполагалось выполнить к понедельнику, не завершена. Запомните, только то, что индекс не используется часто, не означает его бесполезность.
Обратите внимание, что я сказал отключение, а не удаление. Когда вы уверены, что индекс не нужен, начните с отключения индекса, а не его удаления. Когда индекс отключен, и ваша уверенность в том, что он не нужен, возрастет, тогда можно перейти к удалению.
Если мы хотим отключть индекс IX_Test на таблице Users, это можно сделать, выполнив щелчок правой кнопкой и выбрав команду Disable:
или с помощью следующего кода:
Если мы вскоре столкнемся с проблемой, вызванной недоступностью индекса, он все еще будет находиться в списке индексов, и мы можем быть уверены в его возвращении. Вы можете заметить, что тут нет соответствующей команды Enable (включить). Чтобы вернуть индекс, вам нужно будет перестроить его либо с помощью выбора команды Rebuild в контекстном меню:
либо выполнив следующее:
Перестройка отключенного индекса может потребовать некоторого времени; однако ожидание окончания перестройки индекса гораздо менее утомительно, чем размышление о том, какое определение индекса было изначально.
Проверка использования индекса
Для проверки, что индекс не используется, можно применить следующий скрипт:
SELECT object_name(s.object_id) AS 'Object_Name'
,i.name AS 'Index_Name'
,s.user_seeks AS 'User_Seeks'
,s.user_scans AS 'User_Scans'
,s.user_lookups AS 'User_Lookups'
,s.user_updates AS 'User_Updates'
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON i.object_id = s.object_id
AND i.index_id = s.index_id
WHERE objectproperty(s.object_id, 'IsUserTable') = 1;
GO
Никогда не выполняйте запросы проверки индексов, проверки того, что кажется неиспользуемым, чтобы начать удалять индексы. Информация об использовании индекса не хранится за все время. Даже если вы вернулись в офис после длинных выходных, и конкретный индекс, который вы проверяете, не появился среди используемых, следует, по крайней мере, проверить сначала потенциальные причины этого.
Не перезапускался ли недавно SQL Server?
Статистика в dm_db_index_usage_stats сбрасывается при перезапуске SQL Server. Если вы видите очень мало информации в dm_db_index_usage_stats, причиной может быть недавняя перезагрузка сервера для установки патча или из-за другой проблемы, которая привела к перезапуску SQL Server. Это одна из многих причин, почему важно знать расписание перезагрузок сервера.
Когда используется индекс?
Возможно, вы проверяете индексы в конце месяца и обнаруживаете индекс, который обновлялся, но не имел сканирований или поиска в нем. Вы решаете отключить его, и уходите домой на выходные. При возвращении в офис вы понимаете, что есть ежемесячное задание, которое полагается на этот индекс, и вся обработка, которую предполагалось выполнить к понедельнику, не завершена. Запомните, только то, что индекс не используется часто, не означает его бесполезность.
Отключение перед удалением
Обратите внимание, что я сказал отключение, а не удаление. Когда вы уверены, что индекс не нужен, начните с отключения индекса, а не его удаления. Когда индекс отключен, и ваша уверенность в том, что он не нужен, возрастет, тогда можно перейти к удалению.
Если мы хотим отключть индекс IX_Test на таблице Users, это можно сделать, выполнив щелчок правой кнопкой и выбрав команду Disable:
или с помощью следующего кода:
ALTER INDEX IX_Test ON Users DISABLE;
Если мы вскоре столкнемся с проблемой, вызванной недоступностью индекса, он все еще будет находиться в списке индексов, и мы можем быть уверены в его возвращении. Вы можете заметить, что тут нет соответствующей команды Enable (включить). Чтобы вернуть индекс, вам нужно будет перестроить его либо с помощью выбора команды Rebuild в контекстном меню:
либо выполнив следующее:
ALTER INDEX IX_Test ON Users REBUILD;
Перестройка отключенного индекса может потребовать некоторого времени; однако ожидание окончания перестройки индекса гораздо менее утомительно, чем размышление о том, какое определение индекса было изначально.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой