7 Aralık 2009 Pazartesi

Non-Clustered Index ve Include Kullanımı

SQL Server 2005 ve 2008'de Non-Clustred Index'lere Include kolonları ekleme şansımız var. Clustered Index'ler üzerinde ise Include kullanma imkanımız yok. Zaten Clustered Index verilerimizin kendisi olduğundan dolayı, tüm kolonlarımız Clustered Index'imize Include edilmiş haldedir diyebiliriz.

Non-Clustered Indexlerde, Index'i belirleyen Key kolonların yanında nonkey kolonları "Include" edebiliyoruz. Bu NonKey kolonlar sadece Leaf Node üzerinde saklanıyor. Non-Clustered Index'lerin key kolon sayısı en fazla 16 olabilir ve bu kolonların toplam uzunluğu 900 byte'ı geçemez. Bu kurala uymayan durumlarda Include kullanımı gene bize yardımcı oluyor. Include olarak kullanılan kolonlar Index Size'a dahil edilmiyor.

Bir Müşteri tablosu düşünelim. MüşteriNo alanımız Clustered Index Key'imiz ve Müşteri Soyadı artı İsmi alanları üzerinde bir Non-Clustered Index tanımımız var. İsimle yaptığımız bir aramada bu Non-Clustered Index kullanılıyor. Örneğin; İsmi Can Uzun olan müşterilerimizi ünvanları ile ekrana dökmek istediğimizde (Emin olun sayıları çok fazladır :). Non-Clustered Index üzerinde hızlı bir şekilde ismi uygun olan kayıtlar bulunuyor, bu kayıtlardaki Clustered Index'e ait Logical RID ile Clustered Index'e ulaşılıyor, sonrasında disk üzerinde kaydın yerini bildiğimizden tüm satırı okuyor ve Ünvan bilgisine ulaşıyoruz. Bay Can Uzun şeklinde bir çok kaydı listelemiş oluyoruz.

Peki Non-Clustered Index'imize Unvan alanını Include edersek ne olur. Bu durumda Non-Clustered Index üzerinde uygun olan kayıtlar gene hızlı bir şekilde bulunacak ancak bundan sonra Unvan bilgisi Index'imiz içerisinde zaten olduğundan, Clustered Index üzerinden daha fazla I/O işlemi yapmamıza gerek kalmayacak. Eğer isim aramalarının çoğunda Unvan bilgisi de bize gerekli ise, bu alanı Include yaparak çok ciddi bir performans kazanımı elde edebiliriz.

Bu noktada şunu unutmamak lazım, sorgumuzda tablodaki beş alan bize gerekli ama Index'imizde key ve nonkey alanlarda sadece dördü varsa, SQL motoru Clustered Index üzerinden satırı okumak zorunda kalacaktır. Bu sorguda Include kolonlarımızın olması bizim için bir avantaj olmayacaktır. Diğer yandan Include edilen her kolon Index boyutumuzu arttıracaktır, her Non-Clustered Index'e birçok Include yapmamız bir süre sonra disk sıkıntısı yaşamamıza sebep olacaktır. Özellikle varchar(max) gibi büyük veri tipleri bize çok fazla yer sıkıntısı yaşatacaktır. Bunun yanında Include için kullanılan kolonlar güncellendiğinde Non-Clustered Index'lerin de Include alanları güncellenecektir. 
Kısacası Include alanlar uygun şekilde kullanıldığında bize büyük performans artışı sağlayacaktır. Ancak bu kolonların verileri diskte hem Clustered Index hemde Non-Clustered Index üzerinde olacağından INSERT, UPDATE işlemleri bu durumdan etkilenecektir.

Hangi alanları Include yapmalıyız dersek.

SQL motoru, istatistiklere göre key kolon önerilerinde ne kadar başarılıysa, nonkey kolon önerilerinde de o kadar başarısızdır. Neredeyse tüm tablo kolonlarını size Include edin şeklinde önerecektir. Key kolonlarımıza eklemek istemediğimiz veya gerek duymadığımız, ancak key kolonlarımız ile sürekli veya çok sık kullanılan alanları Include olarak ekleyebiliriz.


Mevcut bir Index'i silip baştan oluşturmadan, Include alanları değiştiremediğimizi de unutmamalıyız.


Hiç yorum yok:

Yorum Gönder