Назад | Перейти на главную страницу

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

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

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

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

мне наконец удалось найти поисковая фраза в гугле это дало мне ответ на 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:

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

ВЫБРАТЬ имя объекта = ИМЯ ОБЪЕКТА (s.OBJECT_ID), indexname = i.name, i.index_id
, читает = user_seeks + user_scans + user_lookups
, пишет = user_updates
, p.rows FROM sys.dm_db_index_usage_stats s JOIN sys.indexes i ON i.index_id = s.index_id И s.OBJECT_ID = i.OBJECT_ID
ПРИСОЕДИНЯЙТЕСЬ к sys.partitions p ON p.index_id = s.index_id И s.OBJECT_ID = p.OBJECT_ID, ГДЕ OBJECTPROPERTY (s.OBJECT_ID, 'IsUserTable') = 1
И 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, то индекс, вероятно, можно безопасно удалить (если это не требуется для редко используемой логики приложения).