İlk sorgunuzun bir kısmı aşağıdaki gibidir.
FROM [dbo].[calendar] a
LEFT JOIN [dbo].[colleagueList] b
ON b.[Date] = a.d
WHERE DAY(a.[d]) = 1
AND a.[d] BETWEEN @dateStart AND COALESCE(@dateEnd,@dateStart)
Planın bu bölümü aşağıda gösterilmiştir

Gözden geçirilmiş sorgunuzda BETWEEN @dateStart AND ISNULL(@dateEnd,@dateStart)aynı birleştirme için buna sahip

Aradaki fark ISNULLdaha da basitleşiyor ve sonuç olarak bir sonraki katılımda daha doğru kardinalite istatistikleri elde ediyorsunuz. Bu satır içi tablo değerli bir işlevdir ve bunu değişmez değerlerle çağırırsınız, böylece böyle bir şey yapabilir.
a.[d] BETWEEN @dateStart AND ISNULL(@dateEnd,@dateStart)
a.[d] BETWEEN '2013-06-01' AND ISNULL(NULL,'2013-06-01')
a.[d] BETWEEN '2013-06-01' AND '2013-06-01'
a.[d] = '2013-06-01'
Ve bir equi birleştirme yüklemi olduğu b.[Date] = a.diçin, plan aynı zamanda bir eşitlik yüklemini de gösterir b.[Date] = '2013-06-01'. Sonuç olarak, 28,393satırların kardinalite tahmini oldukça doğru olacaktır.
İçin CASE/ COALESCEsürümü ne zaman @dateStartve @dateEnddaha sonra aynı değeri aynı eşitlik ifade kolaylaştırır.Sizlere Tamam ve aynı planı verir ama ne zaman @dateStart = '2013-06-01've @dateEnd IS NULLsadece kadarıyla gider
a.[d]>='2013-06-01' AND a.[Date]<=CASE WHEN (1) THEN '2013-06-01' ELSE NULL END
zımni bir yüklem olarak da uygulanır ColleagueList. Bu sefer tahmini satır sayısı 79.8satırdır.
Bir sonraki birleşim
LEFT JOIN colleagueTime
ON colleagueTime.TC_DATE = colleagueList.Date
AND colleagueTime.ASSOC_ID = CAST(colleagueList.ID AS VARCHAR(10))
colleagueTime3,249,590(tekrar) görünüşte yararlı dizinleri olmayan bir yığın olan bir satır tablosudur.
Tahminlerdeki bu tutarsızlık, kullanılan birleştirme seçimini etkiler. ISNULLPlan karma sadece bir kez tablosunu tarar olduğunu katılmak seçer. COALESCEPlan hala sadece bir kez tabloyu taramak ve 78 kez sonuç biriktirmek ve onu tekrar edebilmek için ihtiyaç duyacağı yuvalanmış döngüler katılmak seçer ve tahminleri. yani, ilişkili parametrelerin değişmeyeceğini tahmin eder.
İç içe döngüler planının iki saat sonra hala devam ettiği gerçeğinden, bu tek bir tarama varsayımı colleagueTimebüyük olasılıkla yanlış görünüyor.
Neden iki birleşme arasındaki tahmini satır sayısının çok daha düşük olduğu konusunda, tablolardaki istatistikleri görmeden emin değilim. Testlerimde çok fazla satır eklemeyi hesapladığım tahmini satır sayılarını çarpıtmanın tek yolu NULL(döndürülen gerçek satır sayısı aynı kalsa bile bu, tahmini satır sayısını azalttı).
COALESCETest verilerimle birlikte plandaki tahmini satır sayısı
number of rows matching >= condition * 30% * (proportion of rows in the table not null)
Veya SQL'de
SELECT 1E0 * COUNT([Date]) / COUNT(*) * ( COUNT(CASE
WHEN [Date] >= '2013-06-01' THEN 1
END) * 0.30 )
FROM [dbo].[colleagueList]
ancak bu, sütunun NULLdeğer içermediği yorumunuzla kareye düşmez.