Bu yazımda MS-SQL Server'da indeks (Index) oluşturuken seçilecek olan kolonlara karar verilmesi aşamasında göz önüne alınması gereken bir durumdan bahsedeceğim. Buna göre, sorgularımızın daha hızlı çalışabilmesi için hangi kolonları oluşturduğumuz indekse dahil ektemek en büyük faydayı verir? Aşağıda bunu incelemeye çalışacağım.
Öncelikle bir veritabanı (Database) açısından tablo indekslerinin (Table Index) ne anlama geldiği konusu üzerinde durmakta fayda var.
Bir veri tabanında indeksler tablo içerisindeki kayıtların daha hızlı biçimde bulunmasını sağlarlar. Bu cümleden de anlaşıldığı gibi indeksler okuma işlemine fayda sağlayan bileşenlerdir. Bir çok kaynakta da rastladığınız gibi kayıt yazma işlemlerinin kayıt okuma işlemlerine göre çok fazla olduğu tablolarda indeksler performans artışı yerine performans kaybı oluşturabilir. Diğer bir taraftan, genel olarak, veritabanlarında okuma işlemleri yazma işlemlerine göre çok daha fazladır. Bundan dolayı bir çok veri tabanının duruma uygun indekleri barındırmaya ihtiyacı vardır.
Bir tabloda birden fazla indeks (burada bahsettiğimiz “nonclustered” indekslerdir) ve her bir indeks te birden fazla kolon olabilir. Çeşitli kaynaklarda tek kolon barındıran indeklere ingilizce karşılığı olarak "Single Column Index", çok kolon barındıran indekslere ise "Composite Index" denmektedir. Bu çeşit indekslerden hangisinin daha faydalı olacağı kullanılan sorguların gereksinimine bağlıdır.
Burada karar verirken etkili olan yer genelde sorgulardaki "WHERE" şartında kullnılan kolonlardır. Bir sorguda " ... WHERE a=1 and b=2 " gibi bir şart mevcutken diğer bir sorguda " ... WHERE c='H' " gibi bir şart olabilir. İndekslerin kapsayacağı kolonlara karar verirken bu şartlar göz önüne alınmalıdır.
Peki bir indeksi oluştururken hangi kolonları kullanmak daha faydalı olacaktır?
Daha öncede bahsettiğim gibi bu tamamen veri tabanındaki sorguların ihtiyacına bağlıdır. Burada indeksleri oluştururken ekleyeceğimiz kolonların sırası önem taşımaktadır. Örnek olarak, sırası ile col1, col2, col3 kolonlarından oluşan bir indeksimiz olduğunu düşünelim ve bu indeksin aşağıdaki sorgulara faydalı olup olmadığını inceleyelim.
İndeks sırası ile col1, col2, col3 kolonlarından olşmaktadır.
Sorgu 1: ... WHERE col1 = 1 AND col2 = 2 AND col3 = 'H'
Sorgu 2: ... WHERE col1 = 1 AND col2 = 2
Sorgu 3: ... WHERE col1 = 1
Sorgu 4: ... WHERE col2 = 2 AND col3 = 'H'
Sorgu 5: ... WHERE col2 = 2
Sorgu 6: ... WHERE col3 = 'H'
Bu durumda elimizde bulunan indeks yukarıdaki 1,2 ve 3 numaralı sorgulara faydalı olurken 4 ve 5 numaralı sorgulara faydalı olmayacaktır.
Yukarıdaki durumdan da anlaşıldığı gibi indeksin faydalı olabilmesi için, sorguda indeksin ilk kolonundan başlayarak oluşturulan alt kümeleri kullanılmalıdır. Buna göre 4 ve 5 numaralı sorgular için sırası ile col2, col3 kolonlarından oluşan bir indeks; 6 numaralı sorgu için sadece col3 kolunu kullanılarak ayrı bir indeks oluşturulmalıdır.
İndeksler oluşturulurken dikkat edilmesi gereken bir diğer nokta ise kolonları eklerken çok tekrar eden bilgileri barındıran kolonları ilk sıraya yerleştirmektir. Bir örnek vermek gerekirse; "isim" ve "soyisim" şeklinde kolonlarımız olduğunu düşünelim. Sistemimizde isim ve soyisim alanına göre arama yapan sorgularımız olsun. Bu durumda indeks ve sorgunun aşağıdaki şekilde olması fayda sağlayacaktır.
İndeks sırası ile soyisim, isim kolonlarından oluşmalıdır. Sorgu ise " ... WHERE soyisim = 'eyüboğlu' AND isim = 'sedat' " şeklinde olmalıdır. Bir önceki örneğimizi göz önüne alırsak bu indeksin ayrıca " ... WHERE soyisim = 'eyüboğlu' " şeklindeki sorgularda da fayda sağlayacağını görürüz. Bu durumda " ... WHERE isim='sedat' " şeklindeki sorgular için sadece "isim" kolonundan oluşan ayrı bir indeks oluşturulmalıdır.
Sonuç olarak indeks şekilleri ihtiyaca göre değişecektir. Veritabanındaki sorgular ve veri miktarı değiştikçe veritabanında indeks şekillerinin de güncellenmesi gerekebilir. Bir veri tabanı için gerken indekslere karar verirken veri tabanının kullnımı (Work Load) incelenebilir ve "Tuning Advisor" gibi araçlardan faydalanılabilir.
KAYNAK: UYGULAMA GELİŞTİRME
Hiç yorum yok:
Yorum Gönder