SARGability hakkında bir soru


11

Sadece bir şeyi doğru anladığımı doğrulamam gerekiyor:

Yakın zamanda bir kullanıcının Linq'te şöyle bir cevap paylaştığı bir SO sorusunu inceledim:

from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p

Linq'e aşina olmayanlar için, bu ifadenin çıktısının (adalet içinde test edilmedi) olmasını beklerdim:

SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE() 

Ben tarih-saat manipülasyon (bu durumda GETDATE()) değişken üzerinde olması gerektiğini söyleyerek bir cevap yayınladı, bu yüzden aslında ifade gibi bir şey yansıtmalıdır:

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())

Cevabımda, şimdi emin olmadığım bitler, aşağıdakileri varsayalım:

  1. Sütunun manipülasyonu nedeniyle dizinler kullanılmayacak
  2. Sorgu planları, yukarıdaki nedenlerden dolayı kısmen farklı olacaktır (test edilmedi, varsayalım)
  3. Yukarıdakilerden dolayı, ilk sorgu aslında 2'den daha kötü performans gösterir.

Benim sorum:

Akıl yürütmemde hiçbir şeyi kaçırdım mı? Doğrumuyum? Son olarak, herhangi bir organın SARGability hakkında iyi makaleleri var mı?

Yanıtlar:


6
  1. doğru
  2. mutlaka değil - uygun bir endeksin mevcut olup olmadığına ve CBO'nun bunu kullanmaya karar vermesine bağlıdır. Örneğin, tablo küçükse veya istatistikler optimize ediciyi filtrenin sonuçların büyük bir yüzdesi için doğru olacağına inandırıyorsa, bir FTS'nin maliyetinin daha düşük olduğunu düşünebilir
  3. bu garanti edilmez - 2. sorgunun daha kötü performans göstermesi bile mümkündür - ancak akıl yürütmeniz temelde sağlamdır. Örneğin, bir FTS'nin gerçekten daha hızlı olacağı bir uç durumda, CBO maliyetin en iyi tahminine dayanarak bir dizin taraması seçebilir - ki bu her zaman sadece bir tahmindir

Biraz googling bu SO sorusunu ve SARGability hakkındaki bu ilginç görünümlü makaleyi ortaya çıkardı


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.