안녕하세요.
다름이 아니고 개발 중에 궁금한 점이 생겨 질문 남겨봅니다..
다음과 같이 웹 화면에서 매개변수를 받아와서 처리하는 프로시저가 있습니다.
============================
ALTER PROCEDURE TEST (
@in_test NVARCHAR(50) = ''
) AS
BEGIN
END
=============================
TEST 프로시저의 하는부분에서 받아온 변수인 @in_test 를 바로 사용하는것보다
DECLARE 로 생성한 변수에 삽입하여 이 새로 만들어진 변수를 사용하는 것이
속도 개선에 도움을 주는 기초적인 튜닝이라는 것을 알게되었습니다.
이에 대해 자세한 이유가 궁금합니다,,,
마이크로소프트에 들어가 자료를 찾아봐도 몰라서 그러는지 잘 찾을 수가 없었습니다 ㅠㅠ
자료와 함께 설명해주시면 정말 정말 감사하겠습니다.
미세먼지 조심하시고 감기 조심하시길 바라겠습니다
읽어주셔서 감사합니다.
Comment 7
-
향지
2019.01.15 19:38
-
앙버터
2019.01.16 09:18
http://www.sqler.com/499702
이 글의 답변을 보고 찾아보고 있었습니다.
글의 내용이 DECLARE로 정의한 변수에 매개변수로 받아온 변수를 대입하여
새로 만든 변수를 사용함으로써 속도 향상을 시킬 수 있다고 하는 것인데
댓글로 달아주신 microsoft 사이트가 현재 없어진 페이지인지 접속이 되지 않아서
어디서 찾아볼 수 있는지 모르겠네요,, ㅠㅠ
-
나는짱이야
2019.01.16 08:21
저도 DB를 잘모르지만 저런 얘기는 개발하면서 처음들어요..ㅠㅠ
-
이리
2019.01.16 09:39
parameter sniffing과 statistics, histogram에 대해서 한번 찾아보시면 도움이 되실겁니다.
SP가 처음 실행될때 optimizer가 SP를 컴파일 하면서 실행계획을 만들게 됩니다.
그리고 리컴파일 일어나거나 캐시에서 실행계획이 사라지기 전 까지는 계속 사용하게 되죠.
컴파일 과정에서 통계를 보고 예상행수를 설정하게 되는데 처음 들어온 파라미터의 histogram을 참조하게 됩니다.
그런데 만약에 어떤 파라미터는 행이 1개고 어떤 파라미터는 행이 100,000개 라면 문제가 될 수 있습니다.
혹은 통계 업데이트가 되지 않아 histogram에 없는 값이 들어 와도 문제가 될 수 있습니다.
행이 1개인 파라미터가 먼저 들어와서 컴파일이 되었다면 행이 100,000개 짜리 파라미터가 들어와도 행이 1개인 실행 계획을 사용하게 됩니다.
그러면 hash나 merge로 풀어야 할 것이 loop로 고정이 될테니 성능이 안나오는 경우가 발생합니다.
optimizer 입장에서는 data skew에 대해서 알지 못하기 때문에 생기는 일이죠.
sp 안에서 변수를 또 선언하여 값을 받게 되면 optimizer 입장에서는 파라미터 값을 알 수 없으니 histogram을 참조하지 못하게 됩니다.
그래서 통계에 있는 all density를 보고 컴파일을 하게 되며 이게 최선은 아니지만 최악은 피할수도 있습니다.
링크 걸린 글에 있는 minsouk님의 설명과 동일한 내용이고요.
SQL Server 운영과 튜닝 이라는 책에 자세하게 잘 나와 있습니다.
위 링크도 참고하시면 도움이 많이 되실겁니다.
-
앙버터
2019.01.16 10:02
안녕하세요.
자세한 답변 정말 감사드립니다..!!
이해하는데에 많은 도움이 되었습니다 ㅠㅠㅠㅠㅠ
정말 감사합니다.!
-
처리짱
2019.01.16 11:55
프로시져 내에 with recompile 옵션을 주는것과 같은 효과군요..
-
이리
2019.01.16 13:03
with recompile은 실행시 매번 컴파일을 다시 하라는 구문입니다.
위 내용은 컴파일시에 histogram을 보느냐 all density를 보느냐에 관한 내용입니다.
어디에 그런 설명이 있나요?