이 진술을 더 빨리 만드는 방법 :“StartDate와 Null 사이의 매개 변수”?

StackOverflow https://stackoverflow.com/questions/847750

  •  21-08-2019
  •  | 
  •  

문제

이 쿼리는 EndDate가 NULL 일 때 오랜 시간이 걸리고 있습니다 (CASE 진술에 대해 생각합니다. CASE 진술이 빠르기 전에)

SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END) 

EndDate가 NULL이면 더 빠르게 사용해야합니까?

도움이 되었습니까?

해결책

변환 또는 케이스가없는 쿼리는 다음과 같습니다.

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())

SQL Server가 모든 행에 대해 getDate ()를 평가하지 않도록하려면 SQL Server가 기본적으로 충분히 똑똑하다고 확신하지만 캐시 할 수 있습니다.

declare @now datetime
set @now = getdate()

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,@now)

쿼리 계획을 게시하면 쿼리가 느린 이유를 설명하는 데 도움이 될 수 있습니다.

SET SHOWPLAN_TEXT ON
go
SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END)

다른 팁

성능이 중요하다면 아마도 사용하지 않을 것입니다. null 오픈 엔드 데이트의 경우 - 대신 최대 지원되는 DateTime을 사용하십시오 (아마도 9 초).

나는 또한 개별적으로 변환을 할 것입니다.

DECLARE @when datetime
SET @when = CONVERT(SMALLDATETIME,'21-05-2009',103) 

SELECT * 
  FROM HastaKurumlari
WHERE @when
BETWEEN startDate AND endDate

위와 원본에는 여전히 약간 다른 것이 있습니다. 설명 할 수 있다면 의지GETDATE() 깔끔하게 (읽기 : 수정) 조금 확인할 수 있습니다.

출발점으로 GetDate ()를 한 번만 호출하면 속도가 향상됩니다.

당신이 그것을 쓰는 방식은 enddate가 null이 될 때마다 getDate ()를 평가하도록 요구하고 있습니다.

getDate ()는 a입니다 비 결정적 함수 쿼리를 최적화 할 수 없으며 수행중인 경향이 있습니다.

당신은 시도 할 수 있습니다 Coalesce 기능:

select * 
from HastaKurumlari
where convert(smalldatetime, '21-05-2009', 103) 
    between startDate and coalesce(endDate, getdate());

확실한 유일한 방법은 대안을 시도하고 각 쿼리에 대해 생성 된 실행 계획을 보는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top