SQL Server: статистика использования индекса?

Есть ли способ в SQL Server, чтобы получить отчет об использовании индекса?

я знаю, что начиная с SQL Server 2005, вы можете получать отчеты о самых популярных запросах с использованием ресурсов, основываясь на том, что находится в кэше плана:

http://i38.tinypic.com/25jfi3o.png

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

2 ответа

Решение

Мне наконец удалось найти поисковую фразу в Google, которая дала мне ответ для SQL Server 2005 и новее:

Как получить информацию об использовании индекса в SQL Server (mssqltips.com):

SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
         I.[NAME] AS [INDEX NAME], 
         USER_SEEKS, 
         USER_SCANS, 
         USER_LOOKUPS, 
         USER_UPDATES 
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
         INNER JOIN SYS.INDEXES AS I 
           ON I.[OBJECT_ID] = S.[OBJECT_ID] 
              AND I.INDEX_ID = S.INDEX_ID 
WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 

Который дает результаты, такие как:

OBJECT_NAME          INDEX_NAME                 USER_SEEKS USER_SCANS USER_LOOKUPS USER_UPDATES
Properties           IX_Properties_PropertyName 0          455477     0            0
Locations_Depricated NULL                       0          71255      0            0
Users                PK__Users__UserIDInteger   137772     58637      47134        72
CurrencyTypes        PK_CurrencyTypes           3397       55554      0            0
ExchangeRates        IX_ExchangeRates           35736      46621      0            0
CurrencyCategories   IX_CurrencyCategories_1    0          25734      0            0
CurrencyCategories   IX_CurrencyCategories      0          22287      19888        0

Или, горячая ссылка на изображение из mssqltips:альтернативный текст

Я использую следующий скрипт, который перечисляет ваши недостаточно используемые некластеризованные индексы:

SELECT имя_объекта =OBJECT_NAME(s.OBJECT_ID), индексное имя = i.name, i.index_id
, читает = user_seeks + user_scans + user_lookups
, пишет = user_updates
, p.rows FROM sys.dm_db_index_usage_stats s ПРИСОЕДИНЯЙТЕСЬ sys.indexes i ON i.index_id = s.index_id AND s.OBJECT_ID = i.OBJECT_ID
ПРИСОЕДИНЯЙТЕСЬ к sys.partitions p ON p.index_id = s.index_id AND s.OBJECT_ID = p.OBJECT_ID ГДЕ OBJECTPROPERTY (s.OBJECT_ID, 'IsUserTable') = 1
AND s.database_id = DB_ID ()
AND i.type_desc = 'nonclustered' AND i.is_primary_key = 0 AND i.is_unique_constraint = 0 AND p.rows> 10000 ORDER BY читает, строки DESC

Этот сценарий исключает некластеризованные индексы, которые также используются для основных или уникальных ограничений (и игнорирует индексы менее 10000 строк).

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

Если чтения равны 0, тогда индекс, вероятно, безопасно отбросить (если это не требуется для редко используемой логики приложения).

Другие вопросы по тегам