Bu makalede mssql server üzerinde bulunan redundant index konusunu detaylı bir şekilde görmüş olacağız.
Redundant (yedekli/gereksiz) index’ler, birbirini tekrar eden veya aynı işlevi gören index’lerdir. Örnek vermek gerekirse ilk indexste sadece A kolonu varsa ikinci index yapısında A kolonunun yanında B kolonunda tanımlanması burada oluşturulan ilk indexsin gereksiz olduğunu göstermektedir. Aynı kolon sıralamasına sahip birden fazla index yapısının redundant index yapısı olarak geçmektedir.
Gereksiz index’ler disk alanını boşa harcamaktadır. Her insert, update ve delete işleminde tüm index’ler güncellenmektedir. Bu yapı bizlere performans anlamında ciddi kayıplar oluşturmaktadır. Ayrıca rebuild ve reorganize işlemlerinin daha uzun sürmesine sebep olacaktır. Fazla gereksiz bulunan her index query optimizer tarafından daha çok plan değerlendirmesine sebep olacak buda performans anlamında bizleri etkileyecektir.
aşağıdaki komut veritabanı altında bulunan Redundant Index olan index yapılarını göstermektedir.
use DB_NAME
;with ind as (
select a.object_id
, a.index_id
, cast(col_list.list as varchar(max)) as list
from (
select distinct object_id
, index_id
from sys.index_columns
) a
cross apply
(
select cast(column_id as varchar(16)) + ',' as [text()]
from sys.index_columns b
where a.object_id = b.object_id
and a.index_id = b.index_id
for xml path(''), type
) col_list (list)
)
select object_name(a.object_id) as TableName
, asi.name as FatherIndex
, bsi.name as RedundantIndex
from ind a
join sys.sysindexes asi
on asi.id = a.object_id
and asi.indid = a.index_id
join ind b
on a.object_id = b.object_id
and a.object_id = b.object_id
and len(a.list) > len(b.list)
and left(a.list, LEN(b.list)) = b.list
join sys.sysindexes bsi
on bsi.id = b.object_id
and bsi.indid = b.index_id

Yukarıdaki resimde ilgili tablo için oluşturulan iki index yapısında kolonlarının benzer olduğunu Redundant index ve father index kolonlarıyla görmekteyiz. İlgili kolonlara baktıktan sonra daha kapsamlı olan index yapısının FatherIndex olarak kabul edildiğini görmekteyiz. Aşağıdaki resimde dikkat edersek Redundant index’in daha az kapsamlı olduğu görülmektedir.


Makalenin başında belirtmiştik Redundant index yapısını performans anlamında disk üzerinde kapladığı alan bakımından sıkıntı yaşayabileceğimizi söylemiştik. Redundant index yapısının Disable veya drop edilmeden önce bu index yapısının kullanılıp kullanılmadığını görmemiz gerekiyor. Bunun için sayfamızda ilgili makale ile Redundant index olarak adlandırılan index’in kullanılıp kullanılmadığını görmemiz gerekmektedir.
Yukarıda verilen linkten Redundant index yapısını kullanılıp kullanılmadığına bakılır. Eğer index yapısı kullanılmıyorsa ilgili index disable veya drop edilir.
İndex yapısı non clustered index ise disable edilen index’ler diskte yer kaplamaz. Sadece metadata bilgileri tutulmaktadır. Bu sebepten ilgili index’in tekrardan oluşturulması gündeme gelirse rebuild işlemi gerçekleştirmeniz yeterli olacaktır.
Tablo altında bulunan index bölümünde ilgili index yapısını görünmesini istemiyorsanız DROP komutu ile ilgili index yapısını silebiliriz.
Aşağıdaki komut ile mevcut index yapısını disable edebiliriz.
ALTER INDEX INDEX_NAME ON TABLO_NAME DISABLE
Aşağıdaki komut ile index yapısını drop edebiliriz.
DROP INDEX INDEX_NAME ON TABLO_NAME
Drop ve Disable işlemi yapıldıktan sonra sayfamızda bulunan ilgili makale ile ana indexsimizin kullanılıp kullanılmadığı takip edebiliriz.
Yukarıdaki index kaldırma işleminde dikkat edeceğimiz başka bir konu Primary Key ve Unique Constraint index’lerinin kaldırılmamalıdır. Foreign Key ilişkileri için kullanılan index’leri dikkatle incelenmesi gerekmektedir.
Bu makalede Redundant index yapısını detaylı bir şekilde görmüş olduk. Başka makalede görüşmek dileğiyle..
Allah’ın mescidlerini, yalnızca Allah’a ve ahiret gününe iman eden, namazı dosdoğru kılan, zekatı veren ve Allah’tan başkasından korkmayanlar onarabilir. İşte, hidayete erenlerden oldukları umulanlar bunlardır. Tevbe Suresi, 18. Ayet