У меня есть высокий спрос транзакционная база данных, что я думаю, сверхиндексируется. Первоначально, это не имело никаких индексов вообще, так добавляя, что некоторые для общих процессов имели огромное значение. Однако со временем мы создали индексы для ускорения отдельных запросов, и некоторые самые популярные таблицы имеют 10-15 различных индексов на них, и в некоторых случаях, индексы незначительно отличаются друг от друга или являются теми же столбцами в другом порядке.
Существует ли простой способ следить за действием базы данных и сказать, не поражаются ли какие-либо индексы больше, или каков их процент использования? Я обеспокоен, что индексы были созданы для ускорения или единственного ежедневного/еженедельного запроса или даже запроса, это не выполняется больше, но индекс все еще должен продолжиться до настоящего времени каждый раз изменения данных.
В случае таблиц интенсивного трафика это дюжину раз, и я хочу устранить индексы, которые пригибают обновления данных при обеспечении только незначительного улучшения.
Посмотрите на количество пользовательских поисков / сканирований / поисков и последний пользовательский поиск / сканирование / поиск в sys.dm_db_index_usage_stats . Эти статистические данные сбрасываются при запуске сервера, поэтому вам придется проверять его после того, как сервер был запущен и работал с соответствующей нагрузкой в течение достаточного времени.
Если Вы находитесь в SQL Server 2005/2008, то Вам следует использовать советник по настройке базы данных .
Можно указать, что он будет запускаться в течение заданного времени, и он будет собирать статистику о том, что используется, а что нет. В конце прогона он выдаст несколько очень полезных наблюдений о том, что нужно сделать для оптимизации вашей стратегии индексации.
Мастер настройки базы данных будет здесь полезен. Используйте профилировщик для записи стандартного набора запросов в течение нескольких часов и используйте этот файл трассировки в мастере настройки для определения возможных избыточных индексов.
Этот скрипт будет смотреть на DMV (динамические виды управления) и найдет эти индексы, которые не были использованы.
DECLARE @dbid INT
SELECT @dbid = DB_ID(DB_NAME())
SELECT
OBJECTNAME = OBJECT_NAME(I.OBJECT_ID),
INDEXNAME = I.NAME,
I.INDEX_ID
FROM
SYS.INDEXES I
JOIN
SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID
WHERE
OBJECTPROPERTY(O.OBJECT_ID, 'IsUserTable') = 1
AND I.INDEX_ID NOT IN
(SELECT S.INDEX_ID
FROM SYS.DM_DB_INDEX_USAGE_STATS S
WHERE S.OBJECT_ID = I.OBJECT_ID
AND I.INDEX_ID = S.INDEX_ID
AND DATABASE_ID = @dbid)
ORDER BY
OBJECTNAME, I.INDEX_ID, INDEXNAME ASC
Уменьшите вам - DMV динамически - E.G. Они сбрасываются на «Ничего» каждый раз, когда вы перезапускаете сервисы SQL Server. Не проверяйте тех, если ваш сервер был только в течение нескольких минут! Почти все индексы будут отображаться в вашем наборе результатов ......
, но если вы сможете контролировать набор результатов этого запроса с течением времени, вы обязательно должны чувствовать, что индексы не используются. Очень удобно!