인프런 커뮤니티 질문&답변

나는그네님의 프로필 이미지

작성한 질문수

SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법

조건절 상수화 이슈(로컬변수, 사용자정의함수), 테이블 변수 최적화 이슈

섹션2 조건절 상수화 이슈(로컬변수, 사용자정의함수), 테이블 변수 최적화 이슈

해결된 질문

24.07.21 20:34 작성

·

80

·

수정됨

0

1) index 열에 조건으로 로컬변수를 사용하면 안되는데

매개 변수는 된다는게 좀 희한하네요

혹시 이 부분 관련해서 참조할 수 있는 사이트가 있을까요?

2) 그리고 12분부터 테이블 변수 사용 예를 들어주셨는데

일반 테이블을 사용했을떄는 Order Detais 테이블 검색 후

Orders 테이블하고 결합한다고 설명해주셨는데

====================================

SELECT TOP(5) *

FROM dbo.Orders AS o INNER JOIN dbo.[Order Details] AS d

ON o.OrderID = d.OrderID

WHERE d.ProductID < 2

====================================

테이블 변수(@Orders)를 사용했을때는

@Orders를 먼저 처리하고 Order Details을 처리한다고 해주셨는데

이게 문제인 이유는 @Orders 를 먼저 검색하게 되면 where 조건이

쓸모 없게 되어 인건가요?

====================================

SELECT TOP(5) *

FROM [Order Details] AS d INNER JOIN @Orders AS o

ON o.OrderID = d.OrderID

WHERE d.ProductID < 2

====================================

답변 2

1

김정선SQL님의 프로필 이미지
김정선SQL
지식공유자

2024. 07. 21. 22:14

안녕하세요 나는그네님,

참고로 질문주신 내용은 "쿼리 튜닝" 과정에서 상세하게 다루는 부분입니다. 차후 혹시 기회가 된다면 쿼리튜닝 교육(저나 혹은 다른 전문가의) 들어보시면 도움이 많이 되실겁니다.

 

여기서는 지면상 간단하게 정리하겠습니다

1) 제가 설명드리고 싶은 내용에 딱 맞는 사이트는 지금 당장은 찾지 못했습니다 (있긴 있을텐데^^)

로컬변수 부분은 제외하고 매개변수를 주인공으로 다루는 페이지 중에 조금 쉽게 설명한 자료를 찾아서 아래 올립니다. 도움이 되셨으면 합니다. (주제는: Parameter Sniffing, 파라미터 스니핑 입니다)

https://blog.sqlauthority.com/2019/12/20/sql-server-parameter-sniffing-and-local-variable-in-sp/

 

2) 핵심 관심사는 테이블 조인 성능 상 조인 순서(A -> B or B ->A)를 결정하는 것이 중요하고 이는 Query Optimizer에 의해서 판단이 되는데, 테이블 변수의 경우 컬럼의 통계 정보를 관리하고 사용하지 않아 행 수 추정이 안되고 이로 인해 조인 순서를 최적화하는데 실패할 확률이 높다는 것입니다. 그 부분을 고려해서 사용에 주의가 필요하다는 것입니다.

 

좋은 질문주셔서 고맙습니다. 열공 & 완강하시기 바랍니다.

김정선 드림

 

 

1

인프런 AI 인턴님의 프로필 이미지

2024. 07. 21. 20:36

안나는그네님, 안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용에 대해 관련된 정보를 찾았습니다. ”[섹션 2. 쿼리 금기사항]의[조건절 상수화 이슈]의 데모실행불가 및 결과차이 문의입니다.” 에서 비슷한 주제에 대한 설명을 찾을 수 있습니다. 이 게시글에서는, SQL Server 2019부터 시작된 새로운 기능인 SCALAR_UDF_INLINING에 대해서 언급하고 있으며, 이 기능이 로컬 변수와 매개 변수에 대한 처리 방식에 어떻게 영향을 미치는지 설명하고 있습니다. 게시글의 답변에서는 SQL Server Edition에 따른 기능 지원 여부와 사용자 정의 함수와 관련된 조건절 상수화 이슈에 대해서 언급하고 있습니다.

이에 조건절에서 로컬변수와 매개변수의 차이점 및 해당 차이의 원인에 대해 어느 정도 이해가 가능합니다. 다만, 테이블 변수 사용 예와 관련한 구체적 질문에 대하여는 해당 답변이 직접적으로 해결하진 않았지만, 두 분야 간의 연관성을 고려할 때 테이블 변수 사용 시의 최적화 이슈에 대해 어느 정도 이해할 수 있는 기반이 될 수 있습니다.

덧붙여, 테이블 변수를 조건절에서의 처리 방식에 대한 성능 이슈는 본질적으로 SQL 서버의 최적화 프로세스에 대해 이해를 필요로 합니다. 테이블 변수가 작동 방식과 이에 대한 SQL 서버의 쿼리 최적화 과정을 이해하는 것은 왜 이런 방식이 문제가 되는지를 이해하는 데 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.