초기 쿼리의 일부는 다음과 같습니다.
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)
계획의 해당 섹션은 다음과 같습니다.

수정 된 쿼리 BETWEEN @dateStart AND ISNULL(@dateEnd,@dateStart)에 동일한 조인에 대해

차이점은 ISNULL더 단순화하고 결과적으로 다음 조인에 더 정확한 카디널리티 통계를 얻는 것입니다. 이것은 인라인 테이블 값 함수이며 리터럴 값으로 호출하여 비슷한 작업을 수행 할 수 있습니다.
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'
그리고 동등 조인 술어가 b.[Date] = a.d있으므로 계획은 또한 동등 술어를 보여줍니다 b.[Date] = '2013-06-01'. 결과적으로 28,393행 의 카디널리티 추정은 매우 정확할 것입니다.
를 들어 CASE/의 COALESCE버전 때 @dateStart와 @dateEnd같은 값 같은 평등의 표현으로 그것을 단순화 확인하고 같은 계획을 제공하지만 때 @dateStart = '2013-06-01'와 @dateEnd IS NULL단지까지로 간다
a.[d]>='2013-06-01' AND a.[Date]<=CASE WHEN (1) THEN '2013-06-01' ELSE NULL END
또한에 대한 암시 적 술어로도 적용됩니다 ColleagueList. 이번에 예상되는 행 수는 79.8행입니다.
다음 조인은
LEFT JOIN colleagueTime
ON colleagueTime.TC_DATE = colleagueList.Date
AND colleagueTime.ASSOC_ID = CAST(colleagueList.ID AS VARCHAR(10))
colleagueTimeA는 3,249,590(다시) 인 행 테이블없이 유용한 인덱스 분명히 힙.
이 추정값의 불일치는 사용 된 조인 선택에 영향을줍니다. ISNULL계획은 해시 한 번만 테이블을 스캔 조인을 선택합니다. COALESCE계획은 여전히 한 번만 테이블을 스캔하고 78 번 결과를 스풀하고 재생할 수 있도록해야한다는 중첩 루프 조인을 선택하고 추정하고있다. 즉, 상관 파라미터가 변하지 않을 것으로 추정한다.
중첩 루프 계획이 여전히 2 시간 후에 진행되었다는 사실 때문에 단일 스캔에 대한 이러한 가정은 colleagueTime매우 부정확 한 것으로 보입니다.
두 조인 사이의 예상 행 수가 너무 적은 이유에 대해서는 테이블의 통계를 볼 수 없으면 확실하지 않습니다. 테스트에서 많은 행을 추가하는 것이 예상 행 수를 왜곡시키는 유일한 방법은 NULL(실제로 반환 된 행 수가 동일하게 유지되었지만 예상 행 수를 줄였습니다).
COALESCE테스트 데이터가 있는 계획 의 예상 행 수 는
number of rows matching >= condition * 30% * (proportion of rows in the table not null)
또는 SQL에서
SELECT 1E0 * COUNT([Date]) / COUNT(*) * ( COUNT(CASE
WHEN [Date] >= '2013-06-01' THEN 1
END) * 0.30 )
FROM [dbo].[colleagueList]
그러나 이것은 열에 NULL값 이 없다는 의견으로 제곱되지 않습니다 .