Я знаю, что этот поток был довольно долгое время, но я решил добавить свои 2 бита. У нас были проблемы на нашей производственной базе данных sql server 2005, где cpu регулярно работал на 80-100% постоянно в течение всего дня,Мы попытались выполнить трассировку, оценить задания, выполнить дефрагментацию, освободить место на диске, все, что могли придумать, но ничего не помогло.В конце мы нашли сообщение на сайте блога (боюсь, мы не помним, какой именно), которое возобновило использование функции отсутствующих индексов Sql Server.
Как оказалось, SQL Server 2005 и более поздние версии имеют эту функцию;SQL Server постоянно оценивает и записывает рекомендуемые индексы, которые, по его мнению, помогут повысить производительность.Мы запустили приведенный ниже запрос и внедрили 130 лучших индексов (те, которые показывают наибольший потенциальный выигрыш).Наша общая производительность ЦП в настоящее время снижается до 30-40% в самые загруженные часы дня, и пользователи по всему миру говорят нам, что их приложения гораздо более отзывчивы.
Несколько предостережений.Мы не администраторы баз данных, поэтому добавляем индексы на ваше усмотрение.Кроме того, добавление слишком большого количества индексов в какую-либо одну таблицу может отрицательно сказаться на производительности, поэтому следует помнить о том, какие индексы вы добавляете, и всегда следить за перегрузкой индекса.
SELECT mid.database_id,
db.name,
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']' + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns,'') + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid
ON mig.index_handle = mid.index_handle
INNER JOIN sys.databases db
ON mid.database_id = db.database_id
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC