2015. 2. 25. 17:58

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





'2019년 이전 정리 > DB_MSSQL' 카테고리의 다른 글

[MSSQL] LEFT OUTER JOIN 예제  (0) 2014.02.13
[SQL] dateadd 문법  (0) 2014.02.10
Posted by hoonihoon