[MS-SQL] 실행계획 Nested Join Merge Join 문제해결
MS-SQL 실행계획 Nested Join Merge Join 문제 해결
문제:
운영계서버와 테스트서버의 쿼리 속도가 다르다. 실제 0.5 초도 안걸리는 쿼리인데, 운영계서버에서 5초이상 걸리는 문제가 발생하였다.
확인사항:
1. 버전의 문제로 소스가 운영계와 테스트 소스가 다른가? 같음
2. 쿼리의 문제인가? 맞음. 운영계가 5초이상 걸리는 문제 발생
3. 실행계획 비교. 운영계에서 nested join 발생.
수정사항:
nested join 을 hint 를 통해 merge join 으로 변경 -> 해결 ( 테스트서버의 실행계획과 같음)
완벽한 방법인가?
hint 는 테이블의 조인방법과 조인순서를 결정한다고 한다.
hint 의 단점이 있을까? 아직은 단점이 무엇인지 잘 모르겠다.
알아두기
hint 는 merge join 을 사용 했는데 merge join 은 두테이블을 정렬한 다음에 두 집합을 병합(merge) 하면서 조인을 수행하는 것인데, 여기서 병합알고리즘을 사용한다.
두테이블을 정렬해서 사용한다면, union 을 통해 각 테이블을 조회 한 뒤에 조인하는 방식으로 사용 하면 병합과 같은 효과를 낼 수 있다.
추가내용
옵티마이저는 데이터에 양, index 에 달라질 수 있다. 두 서버의 데이터를 동일하게 맞추고, Index 도 맞췄는데 옵티마이저가 다르게 동작 했다. 이런...또 어떤 경우에 달라지는지 찾아보자.
*MS-SQL 에서는 EXEC SP_HELPINDEX 테이블명을 통해 index 를 볼 수 있다.
hint 는 옵티마이저 업그레이드시에 hint 를 따라 가기 때문에 문제가 될 가능성이 있다. 쿼리 수정으로 하는게 좋음.
참조
-- join 설명 http://302.pe.kr/137
-- union 으로 변경 http://otep.tistory.com/70
-- 옵티마이저 공부 http://wiki.gurubee.net/pages/viewpage.action?pageId=26744562