2017-10-06 6 views
1

왜 성능 등 큰 차이 나는 WHERE 절 (첫 번째 쿼리) 내 날짜를 넣어 경우, 또는 내가 매개 변수로 (두 번째 쿼리)WHERE 절에서 하드 코딩 된 날짜가 왜 매개 변수와 동일한 날짜보다 빠른 성능을 제공합니까?

--------/* Execution time 3 sec*/ 
    select 
      tblNoteDiaries.DueDate, 
      col2, 
      col3 
    from MyTable 
    where CAST(tblNoteDiaries.DueDate as date) <= cast(getdate()as date) and cast(tblNoteDiaries.DueDate as date) >= CAST('2017-09-29' as DATE) 

--------/* Execution time 10 sec*/  
    declare  @DateFrom datetime = '2017-09-29', 
       @DateTo datetime = '2017-10-05' 
    select 
      tblNoteDiaries.DueDate, 
      col2, 
      col3 
    from MyTable 
    where CAST(tblNoteDiaries.DueDate as date) >= @DateFrom and cast(tblNoteDiaries.DueDate as date) <= @DateTo 

을 동일한 날짜를 넣으면 내가 저장 프로 시저로이 질의를 필요로한다, 성능 저하없이 날짜 매개 변수를 활용하는 최선의 방법은 무엇입니까 ??

+1

실행 계획에 차이가 있습니까? – FLICKER

+1

가장 일반적인 매개 변수 스니핑입니다. 실행 계획은 당신에게 단서를 줄 것입니다. –

답변

3

나는

select sum(PrinBal) 
from fpc 
where SnapshotDt >= '2017-06-01' and SnapshotDt <= '2017-06-30' 
go 

declare @sd date = '2017-06-01' 
declare @ed date = '2017-06-30' 
select sum(PrinBal) 
from fpc 
where SnapshotDt >= @sd and SnapshotDt <= @ed 
go 

를 쿼리 실행 계획을 확인. 첫 번째 쿼리에서는 48 % 였고 두 번째 쿼리에서는 52 %였습니다. 이 매개 변수 스니핑 말했다

그런 다음 나는 두 번째 쿼리에 option(recompile)를 추가 한 후 두 그래서 닉으로
declare @sd date = '2017-06-01' 
declare @ed date = '2017-06-30' 
select sum(PrinBal) 
from fpc 
where SnapshotDt >= @sd and SnapshotDt <= @ed 
option(recompile) 
go 

정확히 같은 비율

했다.

쿼리 및 저장 프로 시저에 대해 업데이트 된 통계를 사용하거나 RECOMPILE 옵션을 사용하여 매개 변수 스니핑을 제거 할 수 있습니다.

+0

굉장! 대단히 감사합니다 !!! – Oleg

0

변수가 datetime으로 선언되어 있기 때문입니다. 데이터 유형 우선 순위가 더 높습니다. 따라서 DueDate 열을 명시 적으로 date으로 변환하고 다시 datetime으로 변환 중입니다.

변수에 date을 사용하면 동일한 성능이 나타납니다. 더 나은 경우에는 형식이 이미 맞으면 CAST 날짜 열을 사용하지 마십시오. 아래 사용하여 내 데이터베이스에 대한 시뮬레이션

+0

date 및 datetime 유형을 모두 테스트했지만 차이점은 없습니다. – FLICKER