MSSQL Server Index Inclued Column

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.

Önceki makalelerimizde clustered index yapılarının leaf level’de verinin kendisinin olduğundan bahsetmiştik. Nonclustered index yapılarında ise belirtilen kolun değerinin  ve clustered id değerinin leaf levelde olduğundan bahsetmiştik.  Daha detaylandırmak istersek Inclued Column nedir ona değinelim.

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.

Bu makalede Inclued 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

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir