강정식(raxsoft)님이 2007-02-02 17:44:24에 작성한 댓글입니다.
이 댓글은 2007-02-02 17:51:50에 마지막으로 수정되었습니다.
출처 : http://database.sarang.net/?inc=read&aid=29631&criteria=oracle&subcrit=&id=&limit=20&keyword=100%B8%B8%B0%C7%B8%B8&page=1
이 댓글은 2007-02-02 17:51:50에 마지막으로 수정되었습니다.
출처 : http://database.sarang.net/?inc=read&aid=29631&criteria=oracle&subcrit=&id=&limit=20&keyword=100%B8%B8%B0%C7%B8%B8&page=1
안녕하세요. 제가 답변을 드려봅니다.
일반적으로 조인을 할 때, 예를들어 A와 B를 조인할 때 크기가 작은 쪽에서 큰 쪽으로 데이터가 흘러가는게 빠릅니다.
예를들어 보겠습니다.
<테이블 EMP>
<테이블 DEPT>
위에 2개의 테이블이 있는데 나그네님께서 말씀하신 첫번째 쿼리를 보겠습니다.
SELECT A.EMPNO,
B.DEPTNO
FROM EMP A,
DEPT B
WHERE A.DEPTNO = B.DEPTNO
AND A.DEPTNO IN (10, 20);
여기서 보시면 A.DEPTNO IN (10, 20) 으로 인해 A 테이블이 먼저 상수를 받습니다. 그리고 상수화된 DEPTNO를 DEPT 테이블에 넘겨주죠(조인)
이 과정을 일반적으로 A 테이블이 드라이빙 걸렸다고 하는데요. 이 쿼리가 처리하는 전체 로우수를 보겠습니다.
참고로 여기서 말씀드리는 로직은 Full Scan을 기준으로 설명드립니다.(Full Scan은 인덱스 없이 테이블 전체를 뒤져보는 로직입니다.)
/*********************************************************************/
/* 1. 첫번째 쿼리 분석 */
/*********************************************************************/
A.DEPTNO IN (10, 20) 를 통해 EMP 테이블에 (10, 20)인 데이터를 찾습니다. 그럼 EMP 테이블이 총 14 로우수이기 떄문에 전체를 다 뒤지므로 14가 됩니다. --- ①
그리고 (10)을 찾아봤더니 3개 로우가 검색되었습니다. --- ②
이 3개의 로우를 가지고 A.DEPTNO = B.DEPTNO 이 과정을 통해 DEPT 테이블에 (10)이 있는지 찾아봐야겠죠? 만족하는 로우는 1개 이지만 전체를 다 뒤져야 되므로 4번을 찾습니다. --- ③
그리고 (20)에 대해서도 마찬가지로 ②, ③ 번 과정을 거쳤더니 5번, 4번이 나왔습니다.
이를 토대로 (10, 20)에 대해 만족하는 로우를 찾기위해 검색한 총 로우수는 14 + (3 * 4) + (5 * 4) = 46 이 됩니다.
/*********************************************************************/
/* 2. 두번째 쿼리 분석 */
/*********************************************************************/
이제 두번째를 보도록 하겠습니다.
SELECT A.EMPNO,
B.DEPTNO
FROM EMP A,
DEPT B
WHERE A.DEPTNO = B.DEPTNO
AND B.DEPTNO IN (10, 20);
두번째는 EMP부터 상수를 받는게 아니라 B.DEPTNO IN (10, 20) 이것처럼 DEPT부터 상수를 받았네요. 이를 통해 1번에서 했던 과정을 반복해보면 다음과 같은 값이 나옵니다.
DEPT에서 (10, 20)을 찾기 위해 검색한 총 로우수 : 4
(10)을 가지고 EMP에서 찾기 위해 검색한 총 로우수 : 1 * 14
(20)을 가지고 EMP에서 찾기 위해 검색한 총 로우수 : 1 * 14
-> 4 + (1 * 14) + (1 * 14) = 32 이 됩니다.
여기서 보셨다시피 상수로 받는 테이블(드라이빙 테이블)이 조회조건에 의해 만들어진 집합 결과가 작은 쪽이 더 유리하다는 것을 알 수 있을 것입니다.
현재는 EMP와 DEPT테이블에 데이터가 얼마 없어서 첫번째 쿼리와 두번째 쿼리의 응답속도 차이를 별로 못 느끼실테지만 100만건만 넘어가도 확연한 차이를 느끼실 수 있을겁니다.
더 자세한 내용을 원하시면 '새로쓴 대용량 데이터베이스 솔루션' 책을 사셔서 공부하시면 될 것 같습니다.