> 데이터 베이스 > MySQL 튜토리얼 > WHERE 절에서 DateTime 표현식을 사용할 때 SQL Server 2008 쿼리가 느려지는 이유는 무엇입니까?

WHERE 절에서 DateTime 표현식을 사용할 때 SQL Server 2008 쿼리가 느려지는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-18 17:03:13
원래의
897명이 탐색했습니다.

Why is My SQL Server 2008 Query Slow When Using DateTime Expressions in the WHERE Clause?

DateTime 표현식의 쿼리 성능 불일치

문자열 리터럴 값과 비교하여 WHERE 절에서 날짜 표현식을 사용할 때 상당한 속도 저하가 발생하는 쿼리는 쿼리 성능 딜레마를 야기합니다. 문제를 더 깊이 파고들어 해결책을 찾아보겠습니다.

근본 원인

SQL Server 2008의 버그로 인해 성능 격차가 발생합니다. 이는 SQL Server 2008에서 날짜 표현식을 사용할 때 카디널리티 추정에 영향을 미칩니다. WHERE 절. 버그로 인해 일치하는 행 수의 추정이 잘못되었습니다.

최적화된 쿼리

이 버그를 우회하려면 다음과 같은 최적화된 쿼리가 제안됩니다.

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
로그인 후 복사

이 표현식 현재 달의 시작을 반환하며, 이는 이 시나리오에서 원하는 선택 기준일 가능성이 높습니다.

추적 플래그 4199

또는 추적 플래그 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿