쿼리 최적화: 날짜 표현식으로 느린 쿼리 성능 해결
SQL Server 2008을 사용할 때는 날짜 표현식의 영향을 이해하는 것이 중요합니다. 쿼리 성능에 대해 다음 쿼리를 고려하십시오.
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
이 쿼리는 문자열 리터럴을 사용하는 간단한 버전과 비교할 때 매우 느리게 실행됩니다.
Where FK.DT = '2013-05-01'
성능 문제의 원인
성능 저하의 원인은 SQL Server의 카디널리티 추정기 버그로 인해 발생합니다. 이 버그는 복잡한 날짜 표현식을 사용할 때 추정의 정확성에 영향을 미칩니다. 이 경우 표현식은 이번 달의 시작('1786-06-01')으로 평가되어 일치하는 행 수를 잘못 추정합니다.
해결책
성능 문제를 해결하려면 대신 다음 표현식을 사용하는 것이 좋습니다.
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
이 표현식은 다음을 계산합니다. 당월 1일에 더 정확한 카디널리티 추정을 제공하고 쿼리 성능을 크게 향상시킵니다.
또한 추적 플래그 4199를 활성화하면 버그를 해결하고 복잡한 날짜 표현식에 대해 더 정확한 카디널리티 추정을 제공할 수 있습니다. 그러나 이는 올바른 카디널리티 추정에 의존하는 다른 쿼리에 영향을 미칠 수 있다는 점에 유의하는 것이 중요합니다.
모범 사례
최적의 쿼리 성능을 위해서는 더 간단한 사용을 고려하세요. 가능하면 날짜 표현식을 사용하거나 문자열 리터럴을 사용하세요. 날짜 표현식이 복잡하면 카디널리티가 잘못 추정되어 쿼리 최적화에 영향을 줄 수 있다는 점에 유의하세요.
위 내용은 날짜 표현식이 포함된 SQL Server 2008 쿼리가 왜 그렇게 느린가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!