SQL Server2005에서 2 개의 날짜 필드가 비교되는 쿼리가 있습니다. 내가 시간을 포함시키지 않고 비교를 위해 날짜 부분 만 사용한다면 질의는 빠르게 (밀리 초 단위로) 실행됩니다. 그러나 날짜 부분과 함께 시간을 비교해야합니다. 시간 부분을 포함 시키면 쿼리가 매우 느리게 실행되고 마지막으로 연결 시간 초과 오류가 반환됩니다.SQL 서버 날짜/시간 비교를 실행하는 데 시간이 걸림
`((startdate1 >= @startdate2 and enddate1 <= @enddate2) or
(startdate1 <= @startdate2 and enddate1 >= @startdate2 and enddate1 <= @enddate2) or
(startdate1 >= @startdate2 and startdate1 < @enddate2 and enddate1 > @enddate2) or
(startdate1 < @startdate2 and enddate1 > @enddate2))`
이 부분은 쿼리를 실행하는 데 많은 시간이 걸립니다. 그러나 쿼리를 아래 형식으로 변경하면 쿼리가 매우 빠르게 실행됩니다.
((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)
AND cast(CONVERT(VARCHAR(10),enddate1,101) as datetime)<= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) OR
(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)
AND ((cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime))
AND (cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR
(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and
((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) AND
(cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR
(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and
cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)))
제발 나에게 제안 해주세요. 미리 감사드립니다 ...
그건 ... 말이되지 않습니다. 열에 대한 이러한 모든 변환은 잠재적 인 인덱스 사용을 제외해야하지만 첫 번째 쿼리는 인덱스를 사용할 수 있어야합니다 (존재하는 경우). 이 열에 유용한 인덱스가 있습니까? –
첫 번째 사례에 대해 잘못된 쿼리 계획이 캐시 되었습니까? 'fullscan으로 yourtable에서 통계 업데이트'를 실행하십시오 (캐시를 플러시하고 통계를 재 계산해야 함). 다시 시도하십시오. – Arvo
'fullscan으로 yourtable에서 통계 업데이트'를 실행하는 방법 – ASD