SP는 최초(처음) 실행 하는 시점에 실행계획을 수립하고 이후에는 실행계획을 계속 재사용 하게 됩니다
(이것이 SP를 사용하는 중요한 이유 중 하나 입니다).
이 최초 실행계획 수립시, 인수로 넘겨진 파라미터(매개변수)를 기준으로 통계를 통해 예상 행수를 추측하게 됩니다.
그런데 넘겨진 파라미터가 아닌 로컬 변수를 이용해서 쿼리를 실행하면 옵티마이저가 행수 추측이 실패하게 되어
원하지 않는 실행 계획이 생성 될 수 있습니다.
이로 인하여 SP 성능이 저하 될 수 있습니다.
예를 들어 다음과 같이 SP 가 되어 있을 때,
create proc Proc1 (
@p_date varchar(8)
)
as
SELECT
*
FROM
SDSaleMaster a
WHERE
a.SaleDate = @p_date
SP를 호출 하면,
EXEC Proc1 @p_date = '20190601'
실행계획에서 행수를 1326으로 예측 합니다.
이는 통계와 일치하는 제대로 된 예상 행 수 이기 때문에, 실행계획이 적합하게 나올 가능성이 높습니다.
그런데 다음과 같이 매개변수가 아닌 로컬 변수를 사용 하게 되어 있을 때,
create proc proc1 (
@p_date varchar(8)
)
as
declare
@v_date varchar(8)
set @v_date = convert(varchar(8), dateadd(d, -1, @p_date), 112) -- 하루 전
SELECT
*
FROM
SDSaleMaster a
WHERE
a.SaleDate = @v_date
SP를 호출 하면,
EXEC Proc1 @p_date = '20190602'
옵티마이저가 예상 행수를 제대로 추정할 수가 없어서 549로 나오는 데, 이는 해당 테이블의 평균 밀도값을 이용한 것 입니다.
평균밀도
예상 행수 = 밀도 * 테이블 전체 row 수
이 글이 도움이 되셨으면 좋아요 눌러 주시거나 댓글을 남겨 주세요.
'데이터베이스' 카테고리의 다른 글
[SQL서버] SSMS v.18로 로그인시 암호저장이 잘 안될때 (1) | 2019.07.22 |
---|---|
[SQL서버] 임시테이블, 테이블변수 간 성능이슈 (0) | 2019.07.18 |
[SQL서버] 묵시적(암시적) 형변환 (0) | 2019.01.16 |
[Oracle] Windows 환경에서 Oracle 접속 문제(오류) 해결 (4) | 2017.07.11 |
[SQL] SQL서버 2012 유용한 함수 (0) | 2016.11.03 |