SQL Server - как определить, не используются ли индексы?

У меня есть высокий спрос транзакционная база данных, что я думаю, сверхиндексируется. Первоначально, это не имело никаких индексов вообще, так добавляя, что некоторые для общих процессов имели огромное значение. Однако со временем мы создали индексы для ускорения отдельных запросов, и некоторые самые популярные таблицы имеют 10-15 различных индексов на них, и в некоторых случаях, индексы незначительно отличаются друг от друга или являются теми же столбцами в другом порядке.

Существует ли простой способ следить за действием базы данных и сказать, не поражаются ли какие-либо индексы больше, или каков их процент использования? Я обеспокоен, что индексы были созданы для ускорения или единственного ежедневного/еженедельного запроса или даже запроса, это не выполняется больше, но индекс все еще должен продолжиться до настоящего времени каждый раз изменения данных.

В случае таблиц интенсивного трафика это дюжину раз, и я хочу устранить индексы, которые пригибают обновления данных при обеспечении только незначительного улучшения.

8
задан Georg Fritzsche 20 May 2010 в 22:47
поделиться

4 ответа

Посмотрите на количество пользовательских поисков / сканирований / поисков и последний пользовательский поиск / сканирование / поиск в sys.dm_db_index_usage_stats . Эти статистические данные сбрасываются при запуске сервера, поэтому вам придется проверять его после того, как сервер был запущен и работал с соответствующей нагрузкой в ​​течение достаточного времени.

11
ответ дан 5 December 2019 в 08:24
поделиться

Если Вы находитесь в SQL Server 2005/2008, то Вам следует использовать советник по настройке базы данных .

Можно указать, что он будет запускаться в течение заданного времени, и он будет собирать статистику о том, что используется, а что нет. В конце прогона он выдаст несколько очень полезных наблюдений о том, что нужно сделать для оптимизации вашей стратегии индексации.

3
ответ дан 5 December 2019 в 08:24
поделиться

Мастер настройки базы данных будет здесь полезен. Используйте профилировщик для записи стандартного набора запросов в течение нескольких часов и используйте этот файл трассировки в мастере настройки для определения возможных избыточных индексов.

1
ответ дан 5 December 2019 в 08:24
поделиться

Этот скрипт будет смотреть на 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. Не проверяйте тех, если ваш сервер был только в течение нескольких минут! Почти все индексы будут отображаться в вашем наборе результатов ......

, но если вы сможете контролировать набор результатов этого запроса с течением времени, вы обязательно должны чувствовать, что индексы не используются. Очень удобно!

5
ответ дан 5 December 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: