İndex Kavramı_2
24 Aralık 2016 Cumartesi
Sözümüzde duralım ve başlıkta belirttiğim gibi index çeşitleri nelerdir evvelâ buna bakalım:
1-Clustered
2-Nonclustered
3-Unique
4-Filtered
5-XML
6-Full Text
7-Spatial
8-ColumnStore
9-Index with included columns
10-Index on computed columns
(Yukarıdaki maddeler msdn'den alıntıdır.)
Clustered Index :
Bu listenin en başında bulunan Clustered index'in yapısına baktığımızda, bir tablodaki verilerin fiziksel sıralamasını yöneten orkestra şefi gibi düşünebiliriz. Bu sebepten dolayıdır ki bir tabloda sadece bir adet Clustered Index bulunabilir. Örneğin:
CREATE TABLE tblEmployee
(
ID int primary key
)
cümlesini yazdığımızda SQL Server bizim için ID kolonu üzerinden bir adet clustered index oluşturacaktır. (kullanıcının bu işlemi kodla veya arayüzden yapmadığı ihtimali için.)
Clustered Index'ın fiziksel olarak sıralama özelliğinden bahsetmiştim şimdi bunu örneklendirelim:
insert into tblEmployee (ID) values (3)
insert into tblEmployee (ID) values (2)
insert into tblEmployee (ID) values (1)
insert into tblEmployee (ID) values (4)
Yukarıdaki gibi tblEmployee tablom için ID kolonuma özensiz şekilde veri girişi yapıyorum. Sonrasında tblEmployee tabloma SELECT attığımda ID kolonumdaki değerlerimin sıralamasının muntazam olduğunu görüyorum. (SELECT ID from tblEmployee) Bunun sebebi ID kolonu üzerinden yaratılan Clustered Index yapısıdır. (Bu yapı olmasa idi ID kolonumdaki değerler giriş yaptığım sıraya göre gelecek idi. Lütfen bunu sizde deneyiniz.. )
Bir clustered index'in yapısı telefon rehberine benzetilebilir. Ada göre sıralama yaparsınız ve istenilen isme kolaylıkla ulaşabilirsiniz. Biz bu seride ve bir önceki seride bir tabloda sadece bir adet Clustered Index olabileceğine vurgu yaptık. Ancak index'lerin birden fazla kolon üzerine etkisi vardır.(composite index gibi) Örneğin telefon rehberinde ada göre sıralama yapabileceğiniz gibi aynı şekilde ve aynı anda soyada göre de sıralama yapabilirsiniz.
Örnek yazım şekli:
CREATE CLUSTERED INDEX IX_tblEmployee_Gender_Salary
ON tblEmployee(Gender DESC, Salary ASC)
Anahtar Not: Composite kelimesi Index tanımında geçiyor ise, aklımıza hemen birden fazla sütun kullanıldığını anımsamak için gelmeli.
-----------------------------------------------------------------------
Kapsam(Covering) Index :
Birden fazla sütun için tanımlanırlar. Örnek üzerinden inceleyecek olursak:
SELECT EmpID, EmpName, Phone
FROM tblEmployee
WHERE Gender='M'
Bu ifade için EmpID kolonu üzerinde halihazırda bir indeks zaten tanımlı. Şayet biz Gender, EmpName ve Phone kolonları üzerinde bir Covering Indeks tanımlarsak bu sorgu sonucu daha hızlı gelecektir.
Şu şekilde bir Covering Index oluşturabiliriz:
CREATE INDEX CV_tblEmp
ON tblEmp (Gender, EmpName, Phone)
Anahtar Not: Bir sütunda 2 indeksin bulunması pek istenen bir şey değildir. Sık sorgulanan sütunların da indekssiz kalması sakıncalı olabilir. Bu nedenle, sütunlara indeksleri iyi dağıtmak gerekir. Bir sütun üstünde indeks varsa, bu sütunu Covering Indeks içerisinde tekrardan indekslemek gereksizdir.(Örneğimizdeki EmpID sütunu için fazladan Covering Index tanımlamadığımız gibi.)
----------------------------------------------------------------------
Include Deyimli Index :
Covering Index'den farkı; bazı sorguların arama kriterinden fazla sütun çekmesi gerekir. Bu durumda, kapsam indeksine(covering index) bütun sütunları anahtar olarak vermek yerine, sadece arama kriterlerini anahtar olarak verip, geriye kalan sütunları eklenti sütunu içerecek şekilde bir indeks oluşturabilirsiniz.
Kapsam indeksinde yaptığımız örnek üzerinden betimleyecek olursak:
CREATE INDEX CV_tblEmp
ON tblEmp (Gender)
INCLUDE (EmpName, Phone)
Bu ifadede WHERE koşulu ile aranan sütunu anahtar olarak verip, geriye kalan sütunlarıda eklenti sütunu olacak şekilde bir indeks oluşturmuş olduk.
Önemli Not: TEXT, NTEXT ve IMAGE türünden sütunlar eklenti sütun olarak tayin edilemezler.
----------------------------------------------------------------------
WHERE deyimi ile Filtreli Index :
Bu tip indeksler sadece non-clustered tipten indeksler için geçerlidir.
CREATE INDEX FI_tblEmp
ON tblEmp(EmpName, Phone)
WHERE Gender IS NOT NULL
Bu indeks tanımından sonra kullanacağınız şu sorgu ile sonuçlara hızlı bir şekilde ulaşabileceksiniz.
SELECT EmpName, Phone
FROM tblEmp
WHERE Gender is not null
-----------------------------------------------------------------------
Non-Clustered Index :
Non-clustered index yapısına baktığımızda bunu bir kitabın içindeki dağınık şekilde bulunan bölüm numarası gibi düşünebiliriz. Kitabın bölüm numaraları başlangıçta belirtilir ve sizi gitmek istenen bölüm için yönlendirir. Tablo yapısı içinde durum bundan farklı değildir, non-clustered index'ler her satır için işaretçi görevi görürlerde diyebiliriz.
Örnek yazım şekli:
CREATE NONCLUSTERED INDEX IX_tblEmployee_Name
ON tblEmployee(Name)
----------------------------------------------------------------------
Clustered ve Non-Clustered Index arasındaki farklar:
* Bir tabloda sadece bir adet Clustered Index olabilir öte yandan Non-Clustered Index için böyle bir sınırlama yoktur,
* Clustered Index, Non-Clustered Index'e nazaran daha hızlıdır,
* Clustered Index satırları fiziksel olarak sıralar öte yandan Non-Clustered Index mantıksal bir sıralama yapar,
* Clustered Index yapısı için fazladan disk kapasitesine ihtiyaç duyulmaz ancak Non-Clustered Index için böyle bir ihtiyaç söz konusudur(Örneğin siz 1 milyon satırlık veri üzerinde non-clustered index tanımlaması yaptıysanız bu 1 milyon satırlık veri non-clustered yapı için aynı şekilde adreslenir dolayısıyla burada fazladan disk kapasitesi gerekir..),
* Clustered Index'ler genellikle primary key (PK) üzerinden tanımlanırlar oysaki Non-Clustered Index'ler herhangi bir key üzerinden de tanımlanabilirler.