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.