İlk Yazım ile herkese merhaba diyerek başlıyorum; Yazımda Sql Server ile kısaca Indeksleme hakkında bilgi vermeye çalışacağım;Indeksleme select sorguların dönüş oranını hızlandırmak için vazgeçilmezdir. Çok sayıda satır barındıran tablolarda gelen talepler iyi değerlendirilip optimum indeksler belirlenirse maksimum verim sağlanmış olunur ve sqlserver’ın cevap dönmesi daha kısa bir zamanda sağlanmış olur, işleyiş de bir o kadar hızlanır.Tablodaki haraketler zaman içerisinde değişebilir bir yapıda olabilir, örnek verirsek oluşturduğumuz indeksler zamanla, insert ve update işlemlerini yavaşlatabilir dolayısıyla oluşturduğumuz indeksleri gözden geçirmekte fayda olabilir. Clustered Index
Bir tabloda maksimum bir adet tanımlanabilir. B-Tree(Balanced Tree) yapısını kullanır data pageler oluşturarak yapılanır. Eğer bir alana primary key verirsek otomatik olarak clustered index oluşturmuş oluruz. Clustered index ile verilere daha çabuk ulaşmak mümkündür yani select sorgularımızla veriye daha çabuk ulaşabiliriz.Söz Dizimi:
CREATE CLUSTERED INDEX [indexadi] ON [dbo].[tabloadi]([kolonadi] ASC)
Non-Clustered Index
Bir tabloda maksimum 249 adet vardır. SqlServer 2008’de bu sayı revize edilerek 999 adet’e çıkarılmıştır.Bir tabloda clustered indeks varsa oluşturulan non-clustered indeksler clustered index’e atıfta bulunur şayet yoksa heap’e atıfta bulunurlar. Non-clustered indeksler ouşturulduktan sonra clustered indeks oluşturursa bu performans kaybına yol açar, mevcut non-clustered indeksler tekrar oluşturulmaya çalışılıp cluster indeks’e atıfta bulunmaya çalışırlar buda performans kaybına yol açar.Hayattan bir örnek:Büyük bir kütüphaneye girdiğimizi, “Yaşamın Kıyısında” diye bir kitap aradığımızı düşünelim tek tek bütün kitaplara bakmak bayağı bir zamanımızı alıcakrır. A-D, E-G…..U-Z şeklinde kitap koridorlarının olduğunu, bizim tabirimizle indekslendiğini düşünürsek toplam kitap asyısının 500 bin olduğunu bizim U-Z alanında 40 bin kitap olduğunu varsayarsak, 500 bin ile 40 bin arasında büyük bir fark olduğunu görebiliyoruz, sql server bazında çekeceğimiz koşullu bir select sorgusununa benzetirsek performansın ne ölçüde olucağını düşünebiliyor musunuz?Söz Dizimi:CREATE NONCLUSTERED INDEX [indexadi] ON [dbo].[tabloadi]([kolonadi] ASC)
Not: Non clustered indeksler birden fazla kolan için tek bir nonclustered indeks de öbeklenebilir.Aşağıdaki gibi:CREATE NONCLUSTERED INDEX [indexadi] ON [dbo].[tabloadi]([kolonadi1,kolonadi2] ASC)
Unique Index
Unique indeks tanımlayarak ilgili kolonda mükerrer alanlarının önüne geçmiş olursunuz.Söz dizimi:CREATE UNIQUE NONCLUSTERED INDEX [indexadi] ON [dbo].[tablo]([ad] ASC)WITH (IGNORE_DUP_KEY = ON [PRIMARY]
Fakat bu durumun bazen olmasını istemeyebiliriz, örnek verirsek çoklu yaptığınız insertlerde mükerrer bir kayıt geldiğinde sqlserver bir hata dönücektir girişlerimiz yarıda kesilecektir.Dönen Hata: “Cannot insert duplicate key row in object ‘dbo.tablo’ with unique index”. Bunuda düşünmüşler; IGNORE_DUP_KEY = ON olarak verirlirse hataya düşmeyerek o girişi es geçilir ve bloğu işlemeye devam edilir.
Unique olarak verilmemiş indekslerde bu özelliği kullanamazsınız.Not:Indekslerde alter,drop işlemlerini de kullanabilirsiniz.Not: Izin verilen azami indeksi boyutu 900 byte tır, char, varchar, binary, ve varbinary (900 byte) , nchar , nvarchar sütunlar için (en fazla 450 karakter) sınırı dışında kullanılamaz.Sonuç olarak indeks hayat kurtarır çoğu zaman sorguların performansından şikayet edilir, fakat indeks kullanmak akla gelmez. İndeksleme veritabanı ile uğraşan birinin olmazsa olmazlarından biri olmalıdır.Yanlış düşünülüp oluşturulmuş indeksler performans artırmaktan ziyade düşürücü olabilir, insert, update hızını yavaşlatabilirler, yoğun giriş yapılan tablolarda indeksleme yapılmadan önce 2 kere oturup düşünülmelidir.