2017-02-10 1 views
2

의 모든 기록을 얻을 수 있습니다 : 전월에 발생한 날 모든 기록을 얻을 수대부분의 최적의 방법은 내가 항상 사용했던 과거에는 전월

WHERE DATEDIFF(m, [DATE_COL], GETDATE()) = 1 

합니다. 예를 들어이 쿼리를 실행하면 1 월에 발생한 모든 레코드를 가져옵니다.

그러나 나는 현재 상당히 큰 테이블을 사용하고 있으며 위 쿼리를 사용하면로드하는 데 약 30 분이 걸립니다. 그러나, 내가 같은 것을 사용하면

WHERE [SettlementDate] >= DateAdd(DAY, -31, GETDATE()) 

과 같은 것을 사용하면 대개 10 초 이내에 실행됩니다.

내 질문 :
처리 시간이 갑자기 증가하지 않고 WHERE DATEDIFF(m, [DATE_COL], GETDATE()) = 1과 동일한 결과를 얻으려면 어떻게해야합니까?

감사합니다.

+0

원하는 달'DATEPART (m, [date_col])를'비교하십시오. –

+0

이 'DateAdd (DAY, -31, GETDATE())'도 잘못된 데이터로 평가 될 수 있습니다. 마치'GETDATE()'가 3 월 1 일인 것처럼. –

답변

1

DATEDIFF(m, [DATE_COL], GETDATE())을 입력하면 [Date_Col]에 대한 인덱스를 사용할 수 없기 때문에 쿼리가 느립니다.

어쨌든 다음 절을 사용하면 [SettlementDate]에서 인덱스를 사용하고 DATEDIFF() 함수보다 훨씬 잘 수행해야합니다.

WHERE [SettlementDate] >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) 
AND [SettlementDate] < DATEADD(DAY,1,DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1)) 
1

문제는 함수 호출이있어서 쿼리 최적화 프로그램이 함수를 볼 수 없다는 것입니다. 즉, 색인을 사용할지 여부를 결정할 수 없습니다. 이 경우 매우 오랜 시간이 걸릴 수있는 전체 테이블을 읽습니다. 나는 변수를 사용하도록 제안하고 난 당신의 쿼리가 더 나은 결과를 얻을 것으로 예상 : SQL 서버는 날짜와 SettlementDate 값을 비교하려는 것을 알게 될 것이다이 경우

declare @From datetime -- choose the same type as your SettlementDate column 
set @From = DateAdd(DAY, -31, GETDATE()) -- compute the starting date 
select * from yourTable where SettlementDate >= @From 

을 가지고 다른 아무것도 없다 계산하기. 해당 열에 색인이 있으면이를 사용합니다. 스 SARGable 쿼리에 대한

추가 정보 : https://www.codeproject.com/Articles/827764/Sargable-query-in-SQL-server

관련 문제