Tips for DBA: Missing indexes recommendations (SQL Server 2005)

Вы, наверное, уже заметили, какую полезную информацию об индексах и о статистике использования существующих и, как это не удивительно, не существующих индексов можно получить в SQL Server 2005 из системных динамических административных представлений. Особенно впечатляет эта информация, когда её видишь в виде пользовательского отчёта приборной панели производительности SQL Server, которую в качестве бесплатного дополнения к SQL Server Management Studio 2005 предлагает использовать Майкрософт.
Ниже представлен сценарий, который позволяет получить рекомендации по индексам, которых в обозримом прошлом недоставало базе данных, в контексте которой этот сценарий исполняется. Учтите, что сценарий в целях наглядности был упрощён, поэтому результирующие команды по созданию индексов, наверняка, будут содержать ошибки, т.к. тут не учитывается возможность отсутствия не относящихся к предикатам эквивалентности колонок, а также колонок, которые в индексе будут присоединёнными. Впрочем, эти ошибки легко устранимы, просто поищите лишние запятые перед запуском сценария, а также не забудьте удалить пустые инструкции INCLUDE.

    -- Не забудьте поправить сценарий создания индексов, -- убрав лишние запятые или пустую инструкцию INCLUDE SELECT [Рекомендуемый индекс]= '-- CREATE INDEX [IX_' + OBJECT_NAME(mid.object_id) + '_' + CAST(mid.index_handle AS nvarchar) + '] ON ' + mid.statement + ' (' + ISNULL(mid.equality_columns,'') + ', ' + ISNULL(mid.inequality_columns,'') + ') INCLUDE (' + ISNULL(mid.included_columns,'') + ');', [Число компиляций] = migs.unique_compiles, [Количество операций поиска] = migs.user_seeks, [Количество операций просмотра] = migs.user_scans, [Средняя стоимость ] = CAST(migs.avg_total_user_cost AS int), [Средний процент выигрыша] = CAST(migs.avg_user_impact AS int) FROM sys.dm_db_missing_index_groups mig JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle AND mid.database_id = DB_ID()


10 правил здравого смысла для индексов

  1. Создавайте только те индексы, которые будут использоваться. Удалите неиспользуемые индексы.
  2. Создавайте индексы по колонкам, которые в запросах используются в предложениях: WHERE, ORDER BY, GROUP BY или DISTINCT.
  3. Располагайте в ключе индекса вначале самые избирательные колонки, предикаты которых вводят самые большие ограничения выборки.
  4. Некластеризованный индекс максимально полезен, если его ключ высокоселективен.
  5. Создавайте индекс для всех внешних ключей.
  6. Используйте покрывающие индексы для часто используемых ресурсоёмких запросов.
  7. Используйте минимально-возможную длину ключей кластеризованных индексов.
  8. Кластеризованные индексы хороши для выборки диапазонов.
  9. Предпочтительнее много коротких, чем один очень длинный индекс.
  10. На периодической основе используйте программу «Помощник по настройке ядра СУБД».
Published Wednesday, November 14, 2007 6:59 PM by gladchenko
Filed under:

Comments

# re: Tips for DBA: Missing indexes recommendations (SQL Server 2005)

Useful Tricks for Finding Missing and Bad Indexes in SQL Server 2005

glennberrysqlperformance.spaces.live.com/.../cns!45041418ECCAA960!770.entry

Friday, November 30, 2007 2:07 AM by gladchenko

Leave a Comment

(required) 
(required) 
(optional)
(required)