2011-08-02 20 views
5

İndeksli StartDate tarih sütunu içeren bir tablom var. Sadece sorgu optimizasyonu fazı aşağıdaki biçimde sorgularını nasıl işleyeceğini merak:Sorgu eniyileme aşaması bunu düşünüyor mu?

SELECT * 
FROM <dbo.TABLE> 
WHERE (StartDate BETWEEN '2010-01-01' AND '2010-01-10') 
OR (StartDate BETWEEN '2010-01-05' AND '2010-01-15') 

iki tarih arasında bir örtüşme vardır. Optimizasyonu kendim (StartDate BETWEEN '2010-01-01' AND '2010-01-15') olarak vermem gerekiyor mu, yoksa SQL motoru bunu kendi başına optimize edebilir mi?

+1

Yürütme planı ne gösterir? – gbn

+0

Bana aynı planı gösterir. Aslında, her bir bileşene daha derine ineyim ve bir dakika içinde geri dönelim. – Legend

+0

Tamam, aynı G/Ç ve CPU maliyetini gösterir. Sanırım bana kendi sorumu cevap verdin. – Legend

cevap

5

Değişkenler ve sabitlerle karşılaştırın: planlar farklı olmalıdır.

SQL Server, sabitler için en iyi duruma getirebilir, ancak değişkenlerle yeniden kullanmayı amaçlar. Yani plan değişkenlerle daha geneldir. Sabitler kullanıldığında, "genelleştirilmiş yeniden kullanılabilir plan" gerekli değildir, çünkü eğer sabitler değiştiyse yeni bir plan olacaksa

A "değişken" bir plan, sabitlerle kısa devre olacak end < start gibi koşulları dikkate almayacaktır.

olarak soruya açıklamalarda belirtildiği, davranış

yine "Forced Parameterization" ile sabitler için gerçekleşmesi gereken

beklendiği gibi, ama ben denemedim.

İlgili konular