SQL Server - как определить, не используются ли индексы? - PullRequest
8 голосов
/ 08 января 2010

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

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

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

Ответы [ 4 ]

11 голосов
/ 08 января 2010

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

4 голосов
/ 08 января 2010

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

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

3 голосов
/ 08 января 2010

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

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

1 голос
/ 08 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...