Вы, наверное, уже заметили, какую полезную информацию об индексах и о статистике использования существующих и, как это не удивительно, не существующих индексов можно получить в 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 правил здравого смысла для индексов
- Создавайте только те индексы, которые будут использоваться. Удалите неиспользуемые индексы.
- Создавайте индексы по колонкам, которые в запросах используются в предложениях: WHERE, ORDER BY, GROUP BY или DISTINCT.
- Располагайте в ключе индекса вначале самые избирательные колонки, предикаты которых вводят самые большие ограничения выборки.
- Некластеризованный индекс максимально полезен, если его ключ высокоселективен.
- Создавайте индекс для всех внешних ключей.
- Используйте покрывающие индексы для часто используемых ресурсоёмких запросов.
- Используйте минимально-возможную длину ключей кластеризованных индексов.
- Кластеризованные индексы хороши для выборки диапазонов.
- Предпочтительнее много коротких, чем один очень длинный индекс.
- На периодической основе используйте программу «Помощник по настройке ядра СУБД».