Indeksy w bazie danych stosuje się w celu zwiększenia prędkości wykonywania zapytań na tabeli. Można je porównać do spisu treści w książce – zamiast kartkować całą książkę dla znalezienia jednej interesującej nas informacji, możemy zajrzeć do spisu treści i dzięki niemu szybko odnaleźć stronę, na której znajduje się to, czego szukamy. Dzięki temu oszczędzamy czas i zasoby serwera (przede wszystkim liczbę odczytów stron danych). Indeksy powinny być na bieżąco konserwowane, gdyż złe zarządzanie nimi może zamiast skrócić czas wykonywania zapytań – wydłużyć go. Oprócz tego w tabelach często istnieją indeksy, które tworzone są na „czuja” i nie pokrywają tego czego szukamy. Te indeksy powinno się usuwać – sposób na wykrycie nieużywanych indeksów znajduje się w dalszej części wpisu.
Sposób 1:
SELECT
ind.Index_id,
obj.Name as TableName,
ind.Name as IndexName,
ind.Type_Desc,
indUsage.user_seeks,
indUsage.user_scans,
indUsage.user_lookups,
indUsage.user_updates,
indUsage.last_user_seek,
indUsage.last_user_scan,
'drop index [' + ind.name + '] ON [' + obj.name + ']' as DropCommand
FROM
sys.Indexes as ind JOIN Sys.Objects as obj on ind.object_id=obj.Object_ID
LEFT JOIN sys.dm_db_index_usage_stats indUsage
ON
ind.object_id = indUsage.object_id
AND ind.Index_id=indUsage.Index_id
WHERE
ind.type_desc<>'HEAP' and obj.type<>'S'
AND objectproperty(obj.object_id,'isusertable') = 1
AND (isnull(indUsage.user_seeks,0)=0 AND isnull(indUsage.user_scans,0)=0 and isnull(indUsage.user_lookups,0)=0)
order by obj.name,ind.Name
Sposób 2:
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
GO
Po wykryciu indeksów można je wprosty sposób usunąć za pomocą polecenia DROP INDEX albo wybierając nazwę indeksu z listy dla danej tabeli.