SQL Server İndex

 Index, veri tabanı tabloları üzerinde tanımlanan ve veriye daha az işlemle daha hızlı ulaşan veri tabanı nesneleridir. Indexler sayesinde uygulama performansları artacağı gibi sistem kaynaklarıda en verimli şekilde kullanılmış olur. Indexler hakkında piyasada klasik ve net bir şekilde anlamak için telefon rehberi örneği verilir. Telefon rehberindeki kayıtlar sıralı bir şekildedir. Bu sayede aradığımız ismin rehberin içerisinde başında mı sonunda mı veya ortasında mı olduğuna hızlı bir şekilde bakabiliriz. Bu şekilde aradığımız verileri eleyerek bir kaç adımda istediğimiz sonuca ulaşabilirdik. Ancak, bu şekilde olmayıp telefon defterinde rastgele tutulsaydı, arayacağımız bir isim için tüm rehbere bakmamız gerekirdir. Kısaca telefon rehberindeki gibi verinin sıralı tutulmasını sağlayan nesnelere index denir. 

Index Mantığı

SQL sunucusu kurulumundan sonra ilk olarak yeni bir veritabanı oluştururuz. Bu işlem sonunda oluşan dosyalar fiziksel olarak değil mantıksal olarak 8 KB’lık bloklara böler. Bu bloklara page denir. Bundan dolayı dosyanın ilk 8 KB’ı page0, bir sonraki 8 KB’ı page1 olur ve bu şekilde devam eder. Page’lerin içinde ise tablolardaki satırlara benzeyen ve adına row denilen yapılar bulunur. Bunun dışında SQL Server page’ler üzerinde başka bir mantıksal gruplama daha yapar; art arda 8 tane page’in bir araya gelmesiyle oluşan 64 KB büyüklüğündeki veri yapısına extent denir. 

Her page içinde bulunan satır sayısı aynı olmamakla birlikte, veri büyüklüğüne göre değişen satırlara sahiptir. Ayrıca bir satır sadece bir page içinde olabilir. Sonuç olarak  SQL Server aslında satırları okumaz bunun yerine page’leri okuyarak verilere hızlı bir şekilde ulaşır. 

Table Scan

SQL Server'da datalar tablo üzerine kaydedilirken, tanımlama yapılmadığı sürece sıralı olarak diskte tutulmazlar. Bu tip tablolara Heap Table adı verilir. Heap Table üzerine yeni bir kayıt eklendiğinde rastgele data pageler üzerine yazılır. Heap table üzerinde herhangi bir kayıt arandığı zaman tüm dataya erişilip aranan kayıtla karşılaştırılır. Kayıt bulunsa bile başka kayıtlar bulunma ihtimali olduğu için tablo üzerindeki tüm kayıtlarla karşılaştırma işlemi yapılmak zorundadır. Bu işleme TABLE SCAN işlemi denir. Çok yoğun dataların olduğu tablolarda bu arama işlemi çok maliyetli olacağı için kullanılmaz. 

Index Types

Sql Server’da indexler temelde clustered ve non-clustered index olmak üzere ikiye ayrılır. Leaf node’larda tutulan verinin kendisi ise clustered, verinin hangi pagede tutulduğunu gösteren pointer ise non-clustered index diye adlandırılır. 

Clustered Index 

Clustered index’ler tablodaki veriyi fiziksel olarak sıralar. Bir tablo fiziksel olarak sıralandığından tablo üzerinde sadece bir tane clustered index tanımlanabilir. Clustered index için seçilecek kolon veya kolonlar sorgulardaki en fazla kullanılan kolonlar olmalıdır. Veriler, bu kolonlara göre fiziksel olarak sıralanacağından çok hızlı erişilir. 

Ayrıca seçilen kolonun çok değiştirilmeyen bir alan olması gerekir. Çünkü index’e ait kolonun değişmesi demek tüm index’in yeniden organize olması yani fiziksel olarak yeniden sıralanması anlamına gelir. Genelde bu id kolonu olmaktadır. Bunun sebebi de id sürekli artan olduğu için düzenli bir şekilde ilerler index bozulmalarına karşı önlem alınmış olur. SQL Server  index ihtiyacını aslında kendisi belirler. Bizim tanımlayacağımız index’leri kullanıp kullanmamaya kendisi karar verir. 

Non-Clustered Index 

Non-Clustered Index veriyi fiziksel değil mantıksal olarak sıralar. Bu index’lerin leaf node’larında verinin kendisi değil nerede olduğu bilgisi tutulur. Tablo üzerinde en fazla 999 tane non-clustered index tanımlanabilir. Non-clustered index’ler veriye doğrudan erişemez. Heap üzerinden ya da bir clustered index üzerinden erişebilir. Bu index’i oluştururken sorgumuzun koşul kısmında sık kullandığımız kolonlardan oluşturulması gerekir. 

Bir tabloda en fazla 1 clustered index, 999 tane de non-clustered olabilir. SQL Server’da bir index en fazla 16 kolon içerebilir ve toplam boyutu 900 byte’ı aşmaması gerekir. Ayrıca büyük boyutlu alanlar yani varchar(max), nvarchar(max), xml, text ve image türüne sahip kolonlar üzerinde herhangi bir index tanımlaması yapılamaz

Bu genel bilgilerden sonra uygulama geçebiliriz. Daha fazlasına youtube üzerinden Ömer Çolakoğlunun SQL Server index videolarını izlemeniz faydalı olacaktır.

SQL Server Index Oluşturma

Bir tabloda index oluşturulmaya başlandığında SQL Server lisansınız eğer enterprise değil ise tabloyu kitler ve işlem bitene kadar erişimi engeller. Index oluşturma işlemi tablodaki veri sayısına göre kısa veya uzun sürebilir. Dolayısıyla index seçimini bilinçli bir şekilde yapılması gerekmektedir.

index bozulduğu an, indexin varlığı yokmuş gibi olacaktır. 

Primary key olan kolon clustered index yapılırsa ve otomatik artan bir numara olursa index bozulmalarının önüne geçilir. Bunun en büyük sebebi otomatik artan bir numara olmasıdır. Örneğin, tc numarasınıda primary key yapabilirsiniz. Ancak sıralama bozulur çünkü tc numaralı biri 2 ile başlarken diğer 3 ile başlayabilir ve index bozulmasının önüne geçemezsiniz.

Bozulan indexleri düzeltmek için, 

 

 

Blog'a Dön