2011-05-12 6 views
2

두 개의 매우 간단한 쿼리를 사용하고 있습니다. StartDateEndDate뿐만 아니라 Id이 포함 된 클러스터되지 않은 인덱스가 있습니다.선택적 매개 변수 및 날짜 인덱스

DECLARE @startDate DATETIME, @endDate DATETIME 
SELECT @startDate = '4/1/2011', @endDate = '5/1/2011' 

-- Does Index Scan (slow) 
SELECT Id 
FROM dbo.Table 
WHERE 
    (@startDate IS NULL OR StartDate >= @startDate) AND 
    (@endDate IS NULL OR EndDate < @endDate) 

-- Does Index Seek (fast) 
SELECT Id 
FROM dbo.Table 
WHERE 
    (StartDate >= @startDate) AND 
    (EndDate < @endDate) 

인덱스를 가지고 쿼리를 미리 계산을 다시 정렬하거나 변경할 수있는 방법이 있나요 찾는 첫 번째 예에서 발생?

편집 :이 항목은 매우 기본적인 색인 생성 문제입니다. 변수를 선언하고 있지만 sproc의 매개 변수가됩니다.

답변

2

다음은 어떻게됩니까? 당신은 당신이 실제로이 결과 집합에서 를 반환하려는 테이블에서 12/31/9999의 종료 날짜가있는 경우

DECLARE @startDate DATETIME, @endDate DATETIME SELECT @startDate = '4/1/2011', @endDate = '5/1/2011' SELECT Id FROM dbo.Table WHERE StartDate >= ISNULL(@startDate, '1/1/1753') AND EndDate < ISNULL(@endDate, '12/31/9999') 

이 코드

아마도 깨진하지만, 얼마나 자주 그런 일이 무엇입니까?

+0

이것은 모두 동일하지 않습니다. NULL EndDate 또는 StartDate가있는 항목은 제외됩니다. OP의 첫 번째 쿼리에는 해당되지 않습니다. – MartW

+0

@CodeByMoonlight : 맞습니다. 제 경우 StartDate는 null을 가질 수 없지만 EndDate는 그렇게 할 수 있습니다. –

+0

@CodeByMoonlight : 실제로, 검색 조건 자로'EndDate'를 사용할 수는 없지만 여전히'StartDate'를 사용할 수 있습니다. 그래도 여전히 도움이됩니다. 일반적으로 최근 항목 만 가져 오므로 이미 큰 도움이됩니다. 내 특정 구현이 아니라 원래 질문의 목적을 위해 'StartDate'가 nullable 일 경우이 작업을 수행 할 수 있습니까? –

관련 문제