실행계획 문의 0 4 2,014

by 세이안 [SQL Query] [2012.12.21 16:03:37]



실행계획 중에 잘 이해가 가지 않는 부분이 이렇게 문의드려봅니다.

의문이 가는 부분을 scott 계정의 emp, dept를 가지고 똑같이 재현해 보았습니다.

1번 쿼리

select /*+ use_nl(a,b) */ a.*, b.dname from scott.emp a, scott.dept b where a.deptno = b.deptno;

(실제로 사용하는 쿼리에서는 힌트를 주지 않아도 nl을 탑니다)


2번 쿼리

select a.*, (select dname from scott.dept b where a.deptno = b.deptno) dname from scott.emp a;

1번 쿼리에서는 nl 조인이 발생하는데 2번 쿼리에서는 실행계획에 조인이 명시되지 않았습니다.

그리고 consistent gets도 1번 쿼리에서는 23인데 비해 2번 쿼리에서는 12로 절반 가까이 낮습니다.

2번 실행계획에 대한 해석을 부탁드리며

1번 쿼리 대신 2번 쿼리 방식으로 쿼리를 짰을때 문제점은 없는지 여쭤봅니다.

by TeLl2 [2012.12.21 17:50:12]
1번 sql은 조인 구문이라 조인(nl)로 풀린 것이고,
2번 sql은 조인이 아니라 스칼라 서브 쿼리(select 절에 있는 서브쿼리)입니다.
메인 sql(emp)에서 추출되는 데이터 건별로 dept 테이블을 엑세스 하여 결과 추출됩니다.
간단히 설명하면, 스칼러 서브쿼리의 경우 결과값을 한정된 버퍼에 일부를 저장하여
같은 입력값(where절 조건이 같다면)이면 조회를 하지 않고 기존에 추출했던(버퍼에 있던) 값을
그대로 리턴하게 됩니다.
그래서 consistent gets이 12로 줄어 든 것입니다.

스칼러 서브 쿼리의 버퍼 부분은 히든 파리미터로 조절 가능하며,
버퍼 아키텍쳐, 효과에 대한 자세한 사항은 구글링 하시면 많이 나오니 검색해 보세요.

by TeLl2 [2012.12.21 18:09:03]
위의 예제 쿼리에서는 문제가 없겠지만, 
2번으로 했을때의 문제점은 1번과 결과 값이 다르게 나올 수 있습니다.
2번은 1번 쿼리를 outer 조인으로 했을때와 결과 값이 같습니다.
또한 select 절에 나열되는 쿼리는 결과 건수만큼 실핻된다는 점이 이득일 수도, 부하가 될 수도 있습니다.


by 세이안 [2012.12.24 13:11:38]

버퍼에 저장하고 있다가 바로 결과를 리턴했기 때문이였군요!
설명 감사합니다! TeLI2님~

by 신이만든짝퉁 [2012.12.24 17:50:57]
으음~~ 그림이 저만 안보이나요?
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입