Clustered Index ve Nonclustered Index Nedir

Clustered Index

Tablo verisinin tutulduğu B+ ağacıdır. Dolayısıyla, bir tablo için sadece bir adet clustered index bulunabilir. Tüm tablo verisi, B+ ağacının yaprak (leaf) düğümleri üzerinde sıralı bir şekilde tutulur. Verilerin sırasını tablo üzerindeki Primary Key belirler.

Tablo üzerinde belirli bir ID değerine sahip satırın verileri getirilmek isteniyorsa, ilk olarak ağaç üzerinden bu ID değerine sahip yaprak düğüm bulunur. B+ ağacı yaprak düğümü üzerinde ise, tablonun o satırına ait verinin disk üzerinde hangi alanda bulundu bilgisi yer alır. Bu yüzden belirli bir ID değerine sahip satıra erişimek için (SELECT * FROM [TABLO_ADI] WHERE ID=5), { Ağaç üzerinden ID değerinin saklandığı yaprak düğümü bul => Yaprak düğüm içeriğini diskten oku => Satır verilerini diskten oku } yolu izlenir.

Nonclustered Index

Clustered index dışında, tablo üzerindeki veriye erişim için farklı indeksler tanımlanabilir. Tablo üzerinde seçilen bir ya da birkaç sütun üzerinden nonclustered index oluşturulabilir. Seçilen sütunların aldığı tüm değerler, yine B+ ağacı üzerinde tutulur. B+ aşağı disk üzerinde saklanır.

Ağacın yaprak düğümlerinde, düğümde yer alan değerlere karşılık gelen primary key değerleri ve bu değerlerin clustered index üzerinde nerede tutulduklarına ait işaretçiler yer alır. Örneğin, [OGRENCI]tablosunda, öğrencinin yer aldığı [SINIF] sütunu üzerinden bir nonclustered index oluşturulmak istediğinde, B+ aşağı üzerinde tüm sınıf değerleri yer alır. Bu ağacın yaprak düğümlerinde ise, yaprak düğümde yer alan sınıfa ait öğrencilerin ID değerleri ve bu ID değerlerinin ağacın clustered indeksi üzerinde nerede bulunduğu bilgisi (pointer, disk üzerindeki adresi) yer alır. Pointer ile, öğrencilerin diğer bilgilerine ihtiyaç duyulduğunda, her ID için clustered index üzerinden yeniden bir arama yapma ihtiyacı ortadan kalkar.

Modern veritabanı yönetim sistemleri, nonclustered indeks yaprak düğümlerinde, primary key dışında, tablo satırına ait farklı sütun değerlerinin de saklanmasına imkan verir. Bu durum disk üzerinde saklanan nonclustered index boyutunun büyünesine sebep olacaktır.

Her nonclustered indeks veritabanı boyutunu büyüteceği ve insert/update/delete maliyetlerini artıracağı için, index tanımlama konusunda dikkatli olmak gerekmektedir.