Indeksi u Majkrosoft SQL Serveru koji se ne koriste, ali se ažuriraju

Svi znamo da su indeksi važni za ubrzanje procesiranja upita, ali da bi SQL Server skladištio i održavao indekse, potrebni su mu prostor na disku i računarski resursi. Ako imate indekse koji se ne koriste, oni vam troše resurse i dovode do toga da vam INSERT UPDATE i DELETE naredbe traju duže jer se tom prilikom moraju ažuriraju i odgovarajući indeksi. Ako ni jedna aplikacija, odnosno upit koji one pokreću, ne koriste dati indeks onda on nije ni potreban.

Povremeno bi trebalo da pregledate statistiku korišćenja indeksa na Microsoft SQL Serveru da biste utvrdili kako se koriste. To možete da uradite koristeći sistemski DMV (Microsoft SQL Server Dynamic Management View) sys.dm_db_index_usage_stats. Taj view će vam omogućiti da vidite da li su indeksi korišćeni u pretraživanju, sortiranju i drugim SQL Server operacijama, kao i da li su indeksi ažurirani. Ne zaboravite da view prate informacije od momenta pokretanja Microsoft SQL Server servisa i zbog toga bi trebalo da koristite ovaj DMV tek pošto je Microsoft SQL Server neprekidno bio u funkciji izvesno vreme.  Na ovaj način ćemo dobiti precizniju sliku o upotrebi indeksa.

Korišćenjem SQL Server sys.dm_db_index_usage_stats možete identifikovati indekse koji nikad nisu bili korišćeni. U navedenom kodu dalje u tekstu postoje dve naredbe SELECT sa operatorom UNION između njih. Prva naredba SELECT identifikuje one indekse koji nikad nisu bili korišćeni u vašoj bazi podataka, ali su redovno ažurirani tokom izmene podataka. Druga naredba SELECT identifikuje one indekse koji nikad nisu bili upotrebljeni niti ažurirani – drugim rečima, podaci u tabelama nad kojima su napravljeni ovi indeksi nisu menjani.

Trebalo bi da razmotrite povremeno pokretanje ovog upita da biste identifikovali indekse koji ne doprinose upitima na Microsoft SQL Serveru, a pri tome bespotrebno zauzimaju prostor na disku i računarske resurse. Kad otkrijete koji se indeksi ne koriste, možete utvrditi koji su vam potrebni, a koji nisu.

— Indeksi koji su ažurirani, ali nisu korišćeni

use YourDatabaseName

GO

select SCHEMA_NAME(o.schema_id) as [schema_name],

       OBJECT_NAME(s.object_id) table_name,

       i.name index_name,

       s.user_seeks,

       s.user_scans,

       s.user_lookups,

       s.user_updates,

       ‘yes’ Index_updated_but_not_used

from sys.dm_db_index_usage_stats s

join sys.objects o

on s.object_id = o.object_id

join sys.indexes i

on s.index_id = i.index_id

and s.object_id = i.object_id

where

(s.user_seeks = 0 

and s.user_scans = 0 

and s.user_lookups = 0)

and OBJECTPROPERTY(o.object_id,‘IsUserTable’) = 1

UNION

— indeksi koji se ne koriste i ne ažuriraju se jer se podaci ne menjaju

SELECT

       SCHEMA_NAME(o.schema_id) as [schema_name],

       OBJECT_NAME(o.object_id) table_name,

       i.name index_name,

       0  as user_seeks,

       0 as user_scans,

       0 as user_lookups,

       0 as user_updates,

       ‘no’ as Index_updated_but_not_used

FROM

sys.indexes i

JOIN

sys.objects o

on i.object_id = o.object_id 

WHERE  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 s.index_id = i.index_id

AND s.database_id =  DB_ID(DB_NAME()))

and OBJECTPROPERTY(o.object_id,‘IsUserTable’) = 1

order by Index_updated_but_not_used desc;