SQL Server ведёт статистику недостающих/упущенных индексов основываясь на исполняемых запросах, но нельзя полностью доверять советам SQL Server, так как он не знает всей картины и не может её проанализировать. Стоит учесть следующие моменты:
1. Часто бывает так, что SQL Server может советовать создать 5 индексов в таблице, но на деле их можно объединить в один.
2. Нет смысла создавать индексы для запросов, которые были выполнены 1 раз и больше никогда не будут выполнятся или будут, но крайне редко.
3. Относитесь очень критично к этим советам и планируйте каждый создаваемый индекс через данные советы.
Вот код, с помощью которого можно увидеть недостающие индексы во всех таблицах:
SELECT user_seeks * avg_total_user_cost * (avg_user_impact * 0.01) AS [index_advantage], migs.last_user_seek, mid.[statement] AS [Database.Schema.Table], mid.equality_columns, mid.inequality_columns, mid.included_columns, migs.unique_compiles, migs.user_seeks, migs.avg_total_user_cost, migs.avg_user_impact FROM sys.dm_db_missing_index_group_stats AS migs WITH (NOLOCK) INNER JOIN sys.dm_db_missing_index_groups AS mig WITH (NOLOCK) ON migs.group_handle = mig.index_group_handle INNER JOIN sys.dm_db_missing_index_details AS mid WITH (NOLOCK) ON mig.index_handle = mid.index_handle ORDER BY index_advantage DESC OPTION (RECOMPILE);
Обратите внимание на:
1. last user seek time — данное время должно быть недавним, это время последней попытки сервера обратиться к несуществующему индексу
2. user seeks — количество таких попыток обращения
3. SQL Server пытается всегда советовать включённые столбцы, остерегайтесь этого
4. ВНИМАНИЕ! Не создавайте все предлагаемые индексы, очень внимательно подходите к этому процессу
5. Сервер сбрасывает свою статистику после рестарта или после принудительного сброса с помощью команд.