Способ поиска ненужных индексов операционной базы данных SQL Server?
Помимо потери места в базе данных, ненужные индексы на SQL Server могут замедлять операции вставки и обновления. Разработчики, которым не хватает опыта работы с принципами работы с базами данных, иногда имеют тенденцию создавать табличные индексы, которые не имеют смысла для выполняющихся запросов.
Существует ли общая процедура или инструмент для SQL Server 2005/2008 для анализа рабочей нагрузки базы данных и указания, какие индексы либо никогда не используются, либо не нужны в определенной рабочей базе данных?
Спасибо!
6 ответов
Я вижу здесь симпатичный маленький скрипт на T-SQL ( http://blog.sqlauthority.com/2008/02/11/sql-server-2005-find-unused-indexes-of-current-database/), чтобы показать неиспользуемые индексы, которые должны работать в SQL Server 2005. Еще один http://aspadvice.com/blogs/ssmith/archive/2008/03/31/Find-Unused-SQL-2005-Indexes-for-Current-DB.aspx здесь, тоже.
Похоже, ключом ко всему этому является dm_db_index_usage_stats. Довольно аккуратно! (См. http://msdn.microsoft.com/en-us/library/ms188755.aspx Мне нужно взглянуть на некоторые производственные базы данных, которые я создал сейчас, чтобы посмотреть, как выглядит эта статистика. (Улыбается)
Редактировать: Некоторые очень приятные дополнения здесь: http://blogs.msdn.com/craigfr/archive/2008/10/30/what-is-the-difference-between-sys-dm-db-index-usage-stats-and-sys-dm-db-index-operational-stats.aspx
Об использовании sys.dm_db_index_usage_stats следует помнить несколько вещей:
- Вывод содержит только индексы, которые использовались с момента последнего запуска базы данных. Когда база данных закрыта, все записи из кэша в памяти информации для этой базы данных удаляются. Точно так же кеш не переживает мгновенный перезапуск. Невозможно вручную очистить записи для конкретной базы данных без перезапуска базы данных. В различных статьях, на которые есть ссылки в первом ответе (а также в моем блоге), описывается, как захватывать выходные данные в разное время для анализа временных рядов.
- Обязательно протестируйте весь свой деловой цикл. Вы не хотите удалять индекс, который используется для отчета на конец месяца или запроса генерального директора, даже если это может показаться заманчивым.
- Убедитесь, что вы понимаете различные значения и их значение, прежде чем принимать решение о том, используется ли индекс с выгодой или просто ведется за счет средств.
Надеюсь это поможет.
PS Еще одна вещь для других, читающих это и задающихся вопросом, существует ли эквивалентный метод для SQL Server 2000 - нет, мы (как я был в команде в то время) только добавили возможность для 2005 года.
У нас есть вики-статья на SQLServerPedia со сценарием для этого, а также обучающее видео о том, как его использовать:
Один, чтобы найти индексы, которые не используются:
http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use
И еще, чтобы найти индексы, вы должны добавить:
Попробуйте присоединиться к select * из Sys.dm_db_index_usage_stats. Вы можете увидеть, которые никогда не были затронуты. Удостоверьтесь, что они были достаточно длинны, хотя, выполнение этого на следующий день после создания нового индекса может оказаться недостаточным.
Также имейте в виду, что индексы могут не использоваться сегодня, но по мере увеличения размера данных оптимизатор считает их лучшей ставкой. Обычно с небольшими (новыми) таблицами оптимизатор всегда сканирует, но начинает искать, когда число строк превысило точку перелома
Дэйв Дж
Изменить: Эван победил меня, но он на месте.
Редактировать 2: исправленный совет, забыл бит анти-объединения!
Я сделал запрос, связанный с индексами, и показал это в своем блоге ( http://dbalink.wordpress.com/2008/11/09/how-to-finding-index-usage-stats-with-dmv-in-tsql/)
Имейте в виду, что SQL Server не знает вашего бизнеса. Она не знает, какие бизнес-тактические и стратегические решения приняла и будет принимать ваша компания.
Это означает, что индекс, отсутствующий сегодня, может не иметь отношения к завтрашнему дню или стать более актуальным. Та же логика применяется к индексам, которые используются недостаточно или вообще не используются.
Когда мы работали с SQL Server RTM, я написал свои собственные сценарии для просмотра и составления отчетов о таблицах DM и подумал об автоматизации их деятельности. Один взгляд на отсутствующий индексный отчет, где SQL Server запрашивал добавление всех оставшихся столбцов таблицы в качестве столбцов "Включить" в индекс для таблицы с очень динамичным содержимым, был сдерживающим фактором, который мне был необходим, чтобы не автоматизировать процесс.
Я все еще использую свои сценарии, но я применяю бизнес-решения моей компании к тому, что я делаю - что-то, что я могу сделать в небольшой компании.
Как всегда, знайте свои данные, знайте свой бизнес, знайте направление своего бизнеса.