이 진술을 더 빨리 만드는 방법 :“StartDate와 Null 사이의 매개 변수”?
-
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());
확실한 유일한 방법은 대안을 시도하고 각 쿼리에 대해 생성 된 실행 계획을 보는 것입니다.
제휴하지 않습니다 StackOverflow