Clustered Index ve Non Clustered Index Farkları

Bu makaleyi daha iyi anlamak için önce “SQL Server’da Index Kavramı ve Performansa Etkisi” ve  “SQL Server’da İstatistik Kavramı ve Performansa Etkisi” makalelerimi okumanızı tavsiye ederim. Bu iki makalede detaylı olarak Index ve istatistik kavramları örnekli açıklamalarla anlatılmıştır.

 

Gelelim Clustered Index ve Non Clustered Index’in farkına:

Clustered Index

Non Clustered Index

Veriler(tablo) diskte clustered index’e göre mantıksal olarak sıralı bir şekilde tutulur.

Non clustered index koyulan kolonlar tablodan bağımsız olarak diskte ayrı bir şekilde tutulur. Bu yüzden ekstra yer kaplarlar ve tabloda çok fazla non clustered index varsa, her insert,update ve delete işlemi tablonun haricinde bu tablodaki bütün non clustered index’lere de uygulanacağı için insert,update ve delete performansı yavaşlayacaktır. Bu yüzden çok fazla non clustered index oluşturmak her zaman iyi bir şey değildir.

Arama yaparken Leaf Level’e ulaştığımızda verinin kendisine ulaşırız. Leaf Level için -> “SQL Server’da Index Kavramı ve Performansa Etkisi”

Non Clustered Index’te arama yaparken Leaf Level’e ulaştığımızda verinin kendisi yerine Row Locator bulunur.

 

Eğer tablo heap ise(tabloda clustered index yoksa) row locator olarak pointer /Row ID(RID) bulunur. Arama yaparken Leaf Level’a gelindiğinde row id kullanılarak ilgili kayda ulaşılır. Bu işlem RID Lookup olarak geçer. İyi bir şey değildir. Tablonuza mutlaka bir clustered index koyun.

 

Eğer tablo heap değilse(clustered index varsa) row locator olarak Clustered Index Key vardır. Arama yaparken Leaf Level’a gelindiğinde clustered index key kullanılarak ilgili kayda ulaşılır. Bu işlem Key Lookup olarak geçer.

bir tabloda bir tane olabilir(Çünkü bütün tablo clustered index’e göre diskte mantıksal olarak sıralı tutuluyor. Sadece bir tane clustered index’e göre sıralı olarak tutulabilir.)

Tablo non clustered index’e göre sıralı olmadığı için, non clustered index tablonun dışından ekstra bir alan kullanılarak oluşturulduğu için bir tabloda birden fazla sayıda olabilir.

Included Kolon olmaz. Çünkü Leaf Level’da verinin kendisi tutulur.

Included Kolon olabilir. “SQL Server’da Index Kavramı ve Performansa Etkisi

” isimli makalemde indexler’de included kolon’u detaylı olarak örnekli bir şekilde açıkladım.

Unique te olabilir non unique’te olabilir. Non unique olursa(ki hiç tavsiye etmem) clustered index’e sahip tabloda oluşturacağımız non clustered index’lerin leaf level’indeki row locator’da ki clustered index key’leri unique hale getirmek için uniqueifier isminde 4 byte’lık bir belirleyici koyar. Bu şekilde non clustered index kullanılarak yapılan bir aramada ihtiyacı olan veriyi bulmasını sağlar. Extra maliyet, extra büyüklük.

Unique te olabilir non unique’te olabilir. Unique olursa aramalar daha hızlı sonuç döner. Örneğin tablonuzda 100 kayıt var. Index koyacağınız kolondaki 100 kaydın 100’üde birbirinden farklı. İçinden bir tane kaydı aradığınızda direk o kaydı bulabilirsiniz. Bu işleme index seek denir. Ama kolondaki 100 kaydın 70’inin değeri birbiri ile aynıysa bu kolona koyduğunuz index’in hepsi taranır ve ihtiyacınız olan kayıtlar bulunur. Bu işleme de index scan denir. Kötü gibi görünsede bazı durumlarda tüm tablonun taranmasından daha iyidir.(table scan) Ama bu tip unique’liği sağlamayan kolonları filtre olarak kullanmak yerine unique’liğe yakın kolonları ya da direk unique kolonları filtreleyerek sorgu yazılması daha performanslı olacaktır.

Anlaşılacağı üzere Clustered Index ve Non Clustered Index birbirinin alternatifi değildir. Bir tabloda clustered index olması gerekir. Clustered index olmazsa tablo diskte dağınık bir şekilde durur.  Clustered Index olan bir tablodada başka şekilde arama yapma ihtiyacınız için Non Clustered Index koyabilirsiniz. Ayrıca ilişkisel bir veritabanı kullandığınız için primary key foreign key kullanmaya ihtiyacınız olabilir. Tabloya primary key koyarsanız sql server otomatik olarak arka tarafta primary key koyduğunuz kolona clustered index koyar. Default olarak bu şekilde clustered index koysa bile siz primary key kolonun non clustered olması için force edebilirsiniz.

Loading

Leave Your Comment