Есть ли в 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, то индекс, вероятно, можно безопасно удалить (если это не требуется для редко используемой логики приложения).