참고 : 원래이 답변을 작성했을 때 나는 열 중 하나의 색인이 다른 답변보다 성능이 좋은 쿼리를 만들 수 있다고 말했고 Dan Fuller가 언급했습니다. 그러나 나는 100 % 올바르게 생각하지 않았습니다. 사실 계산 된 열이나 인덱싱 된 (materialized) 뷰가없는 경우 이 필요하고 전체 테이블 스캔은 일 것입니다. 왜냐하면 비교되는 두 날짜 열이 과 동일하고 테이블이기 때문입니다!
나는 아래 정보에 여전히 가치가 있다고 믿습니다. 즉, 1) 다른 테이블의 열 사이에서 비교할 때와 같이 올바른 상황에서 성능이 향상 될 가능성, 2) SQL 개발자의 습관을 다음과 같이 촉진하는 것 모범 사례와 옳은 방향으로 사고를 재구성하십시오.
만들기 조건 스 SARGable
내가 말하는 겁니다 가장 좋은 방법은, 비교 연산자의 한쪽에 혼자과 같이 하나의 열을 이동 중 하나입니다 : I로
SELECT InitialSave = DateDiff(second, T.BegTime, T.EndTime)
FROM dbo.MyTable T
WHERE T.EndTime <= T.BegTime + '00:00:10'
단일 테이블에 대한 검색을 피할 수는 없지만 이와 같은 상황에서는 큰 차이를 만들 수 있습니다 :
SELECT InitialSave = DateDiff(second, T.BegTime, T.EndTime)
FROM
dbo.BeginTime B
INNER JOIN dbo.EndTime E
ON B.BeginTime <= E.EndTime
AND B.BeginTime + '00:00:10' > E.EndTime
EndTime
은 현재 비교의 한 쪽에서 두 조건 모두에 있습니다.BeginTime
테이블의 행 수가 많고 EndTime
테이블의 인덱스가 EndTime
인 경우이 값은 DateDiff(second, B.BeginTime, E.EndTime)
을 사용하는 것보다 훨씬 더 우수합니다. 엔진 스캔BeginTime
테이블, 그것은 EndTime
테이블에을 추구 할 수 있도록 - 이제 유효한 "검색 인수가"가 의미 스 SARGable이다. 그것은
I 참조 DateDiff의 AND B.BeginTime > E.EndTime - '00:00:10'
정밀로 전환 할 일부 대수를 수행하여 자체 BeginTime
를 넣어 실험을 가치가있을 수 있습니다 - 컬럼의주의 깊은 선택은 연산자의 한쪽이 필요 자체입니다 또한 DateDiff
은 이 경과 된 시간 인을 반환하지 않으며 대신 경계의 수를 계산합니다 (). 초를 사용하는 DateDiff
에 대한 호출이 1
을 반환하면 이것은 3 ms
경과 시간을 의미 할 수 있으며 1997 ms
을 의미 할 수 있습니다! 이것은 본질적으로 ± 1 시간 단위의 정밀도입니다. +의 더 나은 정밀도 - 2 시간 단위, 당신은 비교 다음 쿼리를 원할 것 0
EndTime - BegTime
에 :
SELECT DateDiff(second, 0, EndTime - BegTime) AS InitialSave
FROM MyTable
WHERE EndTime <= BegTime + '00:00:10'
이 이제 하나의 초 총의 최대 반올림 오류가 아니라 두 (효과, floor() 작업). date
또는 time
값을 뺀 값을 datetime
으로 변경하거나 다른 방법을 사용하여 더 좋은 정밀도를 얻을 수 있습니다 (전체적으로 많이 DateAdd
, DateDiff
및 기타 정크가 될 수 있음). 즉, datetime
데이터 유형을 빼기 만하면됩니다. 아마도 더 높은 정밀도 시간 단위를 사용하고 나누기).
이 원칙은 시간, 일 또는 월과 같이 더 큰 단위를 계산할 때 특히 중요합니다. DateDiff
이 1 month
일 경우 62 일 간격이 될 수 있습니다 (2013 년 7 월 1 일 - 2013 년 8 월 31 일). "작업"을 만드는 넘어
그래서이 외에도 20 개의 컬럼을 선택한다면, 두 문장 (내부와 외부)에서 모두 SELECT해야 할 것입니다. 맞습니까? 더 좋은 방법이 있습니까? –
원하는 경우 InitialSave, Col2, Col3 등을 선택하는 대신 첫 번째 줄에서 select *를 사용할 수 있습니다. –
오, 이런! 감사! * 머리에 자기를 때린다 * –