Bu makalede MSSQL Server Index Inclued Column konusunu detaylı bir şekilde ele almış olacağız. Leaf level’de bulunan verinin herhangi bir lookup işlemi yapmadan aradığı ilgili kolonun aynı veri kümesinin içerisine eklenmesi işlemidir. Şimdi detaylı bir şekilde açıklayalım. Sql server key lookup işlemlerinde kullanılan index’in included kolon içermesi performans anlamında daha etkili bir yöntem olur. İlk olarak keylookup ve included kolon nedir tanımlamalardan sonra uygulamalı bir şekilde işlemlerimizi yapmış olalım.
SQL Server’da Included Column, bir Non-Clustered Index oluştururken, bu index’in B-Tree yapısındaki “yaprak seviyesine” (leaf level) eklenen ancak index’in sıralama kriterine (key column) dahil olmayan kolonlardır.
Daha basit bir ifadeyle: Index’in arama kısmında değil, sadece sonuçları döndürme kısmında yer alan kolonlardır.
Aşağıda bulunan create script’te Key column(Column1) bölümünde maksimum olunacak kolon sayısı 16 veya 900 bytes limitine tabidir. İnclude kolonlarda sayı sınırı yoktur.(999 Index limiti vardır.)
Neden include kullanılır. Select sonucundaki verileri hızlı getirmek için kullanılmaktadır.
CREATE NONCLUSTERED INDEX IX_IndexName ON TableName (Column1) INCLUDE (Column2, Column3);
Örnek üzerinden gitmemiz anlaşılırlığı açısından daha yararlı olacaktır.
İndex seek+Key lookup: Tablomuzda primary key ve koşulumuzda belirttiğimiz kolun üzerinde arama işlemi yaparsak sql server ilgili indexs’i bulacak nonclustered indexs’ler clustered indexs’lerden ayrı bir yerde tutulduğu için nonclustered üzerinde bulunan kayıt ile birlikte bulunan clustered id ile clustered indexs’e giderek aradığı kaydı bulmuş olacağız.

Yukarıdaki sorgumuzda modifiedDate kolunu üzerinde nonclustered index tanımlı, tanımlanan bu nonclustered diskten ayrı bir yerde clustered_id ve tarih değerine göre durmaktadır. Kullanıcı indexste olan ifadeyi şart koşulunda belirledikten sonra select ifadesinde bulunan firstname ve lastname ifadelerini almak için clustered indexs’e gider bu iki ifadeyi alıp nested loops ifadesiyle birleştirmektedir.
Dikkat ederseniz maliyetin büyük bir çoğunluğu key lookup işleminde oluşmaktadır. Bu durumda included kolun yapısı devreye girmektedir. Key lookup yapmadan yani clustered index’e gitmeden sadece index’i kullanarak ihtiyacını sağlamak için modifiedDate kolonuna koyduğumuz index’e included alan olarak firstname ve lastname kolonunu koyarsak sorgu sadece index üzerinde ihtiyacı olan veriyi bulabilecek. Bu tip nonclustered indexlere de Covering Index denir.
Yukarıda index seek işlemini yaptığımız index’e girip inclueded alan ekleyelim. Aşağıdaki resimde included columns bölümünden Add denilerek mevcut olan index yapımıza leaf level’da olacak şekilde kolunlar eklenir.

Gelen ekranda sorgumuzda select ifadesinde çağırdığımız kolonları ekliyoruz.


Sorgumuzu tekrardan çalıştırdığımızda keylookup operatörünün kaybolduğunu görmüş oluyoruz.

İndexs Seek: Sql server’ın indexs bulunan kolunu üzerinde direk aradığı kaydı bulmasıdır. Yukarıdaki indexs yapısından farkı tablonun tamamını taramadan aradığı kaydı bulmasıdır.
Operatörlerin ne işe yaradığını öğrenmek için execution plan makalelerinde görebiliriz. MSSQL Server Statistics makalesinde seek,scan,lookup kavramlarının ne işe yaradığını görebiliriz.
Index yapıları tablolardan ayrı bir yerde tutulurlar zamanla kullanıcıların insert update ve delete işlemleri sonucunda index yapılarımız fragmentation olur. Bu yapının önüne geçmek için belirli aralıklarla index bozulmalarının düzeltilmesi gerekmektedir.
Not: Index yapımızda Inclued olarak eklenen bir kolonu silmek için önce ilgili kolonun inclued olan index yapısından çıkarılması gerekmektedir. Yoksa ilgi kolon silinemeyeceğine dair bir hata mesajı alırız. İlgili Index içerisinde bulunan inclued kolon çıkarıldıktan sonra silme işlemi başarılı bir şekilde yapılmaktadır.


Avantajları Nelerdir:
- Performans Artışı: “Key Lookup” veya “RID Lookup” işlemlerini ortadan kaldırarak disk I/O (girdi/çıktı) maliyetini ciddi oranda düşürür.
- Boyut Sınırlarını Aşma: Index anahtar limitine (900 byte) takılan uzun metinleri INCLUDE ile index’e ekleyebilirsiniz.
- Daha Az Bakım Maliyeti: Veriler INCLUDE kısmında sıralanmadığı için, bu kolonlardaki güncellemeler index’in B-Tree yapısını bozmaz (sadece yaprak seviyesinde veriyi günceller).
Ne Zaman Kullanmamalısınız:
- Tablonuzda çok sık UPDATE işlemi yapılıyorsa; INCLUDE ettiğiniz kolon her değiştiğinde index de güncellenmek zorundadır.
- Her kolonu INCLUDE etmeye çalışmayın; bu index’in boyutunu devasa hale getirir ve hafıza (RAM) kullanımını artırır.
Bu makalede Include Column ifadesini detaylı bir şekilde görmüş olduk.
Başka bir makalede görüşmek dileğiyle..
Kadir gecesi, bin aydan daha hayırlıdır. Kadir Suresi, 3. Ayet
