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