Sorgularda Index Kullanımı
İndeksler, arama sorgularına ait şartları içeren kayıtlara, tüm tabloyu taramadan hemen ulaşmayı
sağlar. Bu sayede indeksler, sorgunun sonucunun kısa sürede dönmesini ve cpu tüketiminin
azalmasını sağlar. Çünkü, indeks’leri verimli kullanmıyan sorgular, ya tüm tabloyu ya da ilgili indeks
ağacının geniş bir alanını taradıkları için çok “logical read” fazla yaparlar. Bu da cpu yükselmesine
neden olmaktadır.
Sorgular nasıl indeks kullanır ?
Aşağıda 3 kolonu kapsayan indeks tanımlanmıştır.
CREATE NONCLUSTERED INDEX [_dta_indeks_ A_B_C] ON [call].[Cdr]
(
[A] ASC,
[B] ASC,
[C] ASC
)
A) Yukarıdaki indeks kullanabilecek sorgular şunlardır:
- Where A=... and B=... and C= ...
- Where A=... and B=...
- Where A=..
Yani sorgunun koşul kısmındaki where şartına ait kolonlar, indeks tanımındaki sıralama ile
aynı olmalıdır.
B) Yukarıdaki indeks örneğinden yola çıkarak, aşağıdaki sorgu bu indeks’i kullanamaz
diyebiliriz.
Örnek: Where B= ... and A=......
C) Özel durumlarda; koşul kısmındaki where şartına ait kolonlar, indeks tanımındaki sıralama ile
aynı olmasa da sorgu indeksi kullanır.
Örnek: Yukarıda tanımlanmış indeksi baz alırsak;
Where C=... and A=... and B= ... şeklindeki sorgu için indeks kullanılır.
Çünkü , sql server’da, sorgu için izlenecek yolu belirleyen query optimizer bilir ki yukarıdaki
where şartı ile “Where A=... and B=... and C= ...” şartı aynıdır. O yüzden ,
“Where A=... and B=... and C= ...” şartına göre query optimizer arama yapar.
Indeks sonuç; Sorguları yazarken , tabloya ait tanımlanmış indeksleri görüp, imkan dahilinde
indeks’lere uygun sorgu yazılmalıdır.
D) ‘Join’ veya ‘where’ şartına ait kolonları, kolon değerlerinin data tipini değiştirerek
kullanmayın! Bu yanlış ,özellikle tarih kolonları üzerinde yapılmaktadır.
Sorguya ait where şartında tarih kolonunu başka bir türe çevirmezseniz, sorgu, tarih kolonuna
ait indeks’i kullanabilir. Ama çokça yaptığımız gibi bu kolonu varchar türüne dönüştürürsek,
sorgu, indeks’i kullanmaz. Aşağıda, bu sorunu aşmanın bir örneği gösterilmiştir.
Örnek:
Bu örnekte , aynı sorgunun indeks’i kullanan ve kullanmıyan versiyonları gösterilmiştir.
UsersLog tablosunun OperationTime kolonuna indeks tanımlanmış olsun.
İndeksi kullanmayan sorgu;
select * from UsersLog
where CONVERT (VARCHAR, OperationTime ,112)=CONVERT (VARCHAR, GETDATE(), 112)
İndeksi kullanılan sorgu;
select * from UsersLog
where
OperationTime between
substring(CONVERT (VARCHAR, getdate(), 121),1,10)+' 00:00:00.000'
and
substring(CONVERT (VARCHAR, getdate(), 121),1,10)+' 23:59:59.999'
Not: Burada önemli olan kolonun varchar’a dönüştürülmemesi, karşılaştırılan ifade dönüştürülebilinir.
Sorgularda Indexed View Kullanımı adlı Makaleye Gitmek için Tıklayınız
Comments (0)