게시일: Jan 10, 2012 4:48:26 AM
WHERE 절에 있는 조건에 따라 두 테이블에서 하나의 테이블을 기준으로 삼아 다른 하나의 테이블에 있는 데이터를 읽는 방식으로 조인을 수행. 여기서 기준이 되는 테이블을 Driving table 혹은 Outer table이라 하고, 나머지 하나의 테이블을 Inner table이라고 한다.
select emp.employee_id, emp.department_id, dep. department_name
from employees emp
, departments dept
where emp.department_id = dept.department_id;
employees 테이블이 드라이빙 테이블. 옵티마이저는 맨 먼저 employees 테이블의 한 로우를 읽어 해당 로우의 department_id 값을 찾고, 이 값을 기준으로 해서 departments 테이블에서 이와 같은 값을 가진 로우를 검색한다. 검색이 완료되면 다시 employees 테이블의 두 번째 로우를 읽고 departments 테이블에서 데이터를 검색하며 이와 같은 방식을 반복한다.
아래와 같은 중복 루프를 생각해도 좋겠다.
for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
......
}
}
[특징]
1. 첫 번째 로우를 받는 시간은 빠르지만, 전체 결과를 받기까지는 시간이 걸린다.
2. 메모리가 필요없는 조인 방법으로 추가적인 메모리 비용이 들지 않는다.
3. 전체적인 성능은 driving table에 있는 데이터가 몇 건인지가 관건이 되며, 드라이빙 테이블의 크기가 전체 쿼리를 수행하는데 큰 영향을 미친다.
4. 거의 대부분의 경우 inner table 검색시 인덱스를 사용해서 검색이 수행되므로 innser table의 인덱스 효율이 좋아야 한다.
또한 driving table 검색시에는 Full Table Scan이나 Index Scan 방식을 사용한다.
5. 일반적으로 옵티마이저는 쿼리 수행 결과가 전체 대상 로우에 대해 15% 이하의 비용을 가질 경우, 즉 적은 수의 로우를 검색하는 경우 NLJ을 사용한다.
6. 일반적으로 조인 조건에 '=' 연산자가 사용될 경우 옵티마이저는 NLJ을 선택하게 된다.