다음과 같이 쿼리를 날렸습니다.
SELECT * FROM NL_JOIN1
AS A WITH(NOLOCK) INNER JOIN NL_JOIN2 AS B WITH(NOLOCK) ON A.ID = B.ID
SELECT * FROM NL_JOIN2
AS A WITH(NOLOCK) INNER JOIN NL_JOIN1 AS B WITH(NOLOCK) ON A.ID = B.ID
데이터는 NL_JOIN1에 10건 NL_JOIN2에 1000건이 있습니다. 그런데 실행계획이 2개가 같습니다. 제가 알기로 NL조인을 할때 드라이빙 테이블인 선행테이블의 크기에 따라서 결과가 달라진다고 알고 있는데요. 왜 결과는 같을까요? 2013.12.27 16:42 2013.12.27 16:57 답변감사합니다. 역시 예상한 실행계획이 나옵니다. 드라이빙 테이블을 옵티마이저가 알아서 잡는군요. 확실히 위의 방법으로 했더니 차이가 납니다. 2013.12.27 18:05 option(force order)는 빼셔도 될듯.. 2013.12.27 18:13 엇 이건 제가 감사한....!!! 순서 고정시킬때 습관처럼 넣고 있었는데 조인힌트에서 순서를 잡아주네요! 2013.12.28 11:04 그럼 LOOP만으로 가능한가보네요??
|
결과가 같다는게
실행계획이 같다는 말씀이신가요?
일단 힌트를 않넣었는데 NL로 실행됐다면
큰 테이블(NL_JOIN2) ID 컬럼에 인덱스가 있을것이고
그러면 쿼리상에서 힌트를 안쓰고 테이블 순서를 바꿔봤자 옵티마이저가 알아서 NL_JOIN2를 후행 테이블로 쓸겁니다.
SELECT *
FROM NL_JOIN2 AS A WITH(NOLOCK)
INNER LOOP JOIN NL_JOIN1 AS B WITH(NOLOCK)
ON A.ID = B.ID
OPTION(FORCE ORDER)
선행 후행 테이블 비교를 위해서면
힌트를 넣어서
요렇게 한번 실행시켜 보세요