문자열 리터럴 값과 비교하여 WHERE 절에서 날짜 표현식을 사용할 때 상당한 속도 저하가 발생하는 쿼리는 쿼리 성능 딜레마를 야기합니다. 문제를 더 깊이 파고들어 해결책을 찾아보겠습니다.
SQL Server 2008의 버그로 인해 성능 격차가 발생합니다. 이는 SQL Server 2008에서 날짜 표현식을 사용할 때 카디널리티 추정에 영향을 미칩니다. WHERE 절. 버그로 인해 일치하는 행 수의 추정이 잘못되었습니다.
이 버그를 우회하려면 다음과 같은 최적화된 쿼리가 제안됩니다.
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
이 표현식 현재 달의 시작을 반환하며, 이는 이 시나리오에서 원하는 선택 기준일 가능성이 높습니다.
또는 추적 플래그 4199를 활성화하여 정확한 카디널리티 추정을 강제할 수 있습니다. 추적 플래그 4199를 사용하면 다음 쿼리도 원하는 계획을 생성합니다.
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE) OPTION (QUERYTRACEON 4199)
예를 들어 FK라는 테이블에는 시작을 나타내는 값이 있는 DT라는 열이 포함되어 있습니다. 매월 다음 두 쿼리는 성능 불일치를 보여줍니다.
-- Slow due to incorrect cardinality estimates SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) -- Fast due to accurate cardinality estimates with trace flag 4199 SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) OPTION (QUERYTRACEON 4199)
추적 플래그 4199가 활성화된 경우, 두 번째 쿼리는 최적화된 쿼리 계획으로 인해 실행 시간이 훨씬 빨라집니다.
위 내용은 WHERE 절에서 DateTime 표현식을 사용할 때 SQL Server 2008 쿼리가 느려지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!