Sargable vs Non-Sargable QueriesBeğen

Sargable sorgular, tabloda tanımlı indeksleri kullanarak arama yapabilen sorgulardır. Non-sargable sorgular ise kesinlikle kaçınılması ve mutlaka sargable alternatifinin bulunarak kullanılması gereken, indeks dostu olmayan, çalışma zamanı oldukça yüksek, kalitesiz sorgulardır.

Non-Sargable Sorgu:

SELECT PER.* 
FROM dbo.Person PER 
WHERE SUBSTRING(PER.Name,1,3)= 'Meh'

Sargable Alternatifi:

SELECT PER.* 
FROM dbo.Person PER 
WHERE PER.Name LIKE 'Meh%'

Yukarıdaki örnekte ilk sorgu için tüm satırlardaki name kolonu öncelikle substring fonksiyonuna gireceği için indeks özelliğini kaybedecektir. İkinci sorguda ise kolon değerleri herhangi bir ön operasyona maruz kalmadan direkt olarak Sargable LIKE operatörü ile sorgulanmıştır.

Non-Sargable Sorgu:

SELECT PER.* 
FROM dbo.Person PER 
WHERE YEAR(PER.BirthDate) > 1987

Sargable Alternatifi:

SELECT PER.* 
FROM dbo.Person PER 
WHERE PER.BirthDate > '19871231'

İndekslenmiş doğum tarihi alanını kullanarak 1987 yılından sonra doğan kişileri getiren yukarıdaki sorguların çalışma zamanları, kayıt sayısına bağlı olarak birbirinden oldukça farklı olacaktır.

Non-Sargable Sorgu:

SELECT PER.* 
FROM dbo.Person PER 
WHERE PER.Age - 18 >= 0

Sargable Alternatifi:

SELECT PER.* 
FROM dbo.Person PER 
WHERE PER.Age >= 18

18 yaşında ve daha büyük kişileri getiren yukarıdaki sorgular da sargable farkını anlatmak için iyi bir örnek olabilir.


Özet olarak, indeksli kolonların arama öncesinde bir fonksiyon, operatör vs. ile işlem görmesi indeks özelliğinin kullanımına engel olacaktır.

Yorum Yaz
00:00:00
Saturday 15 Jan 2017
Altın Sözler
“Herşey bir güzelliğe sahiptir fakat bunu herkes görmez.”
Web hosting by Somee.com