select t1.cola,
t2.colb
from table_1 t1,table_2 t2
where t1.colx = {value}
and t2.id1 = t1.id1
;
* 위의 Query를 For문으로 작성하면 다음과 같다.
for r1 in (select rows from table_1 where colx = {value}) loop
for r2 in (select rows from table_2 that match current row from table_1) loop
output values from current row of table_1 and current row of table_2
end loop
end loop
Outer Loop가 tab_1을 처리하고 Inner Loop가 table_2를 처리한다.
이 pseudo 코드의 구조 때문에 NL 조인에 사용되는 두 테이블은 대개 '아우터(outer) 테이블' 과 '이너(inner) 테이블' 이라고 불린다.
그리고 Outer Table을 종종 '선행(Driving) 테이블' 이라고도 한다.
Execution Plan (9.2.0.6 autotrace - unique access on inner table (traditional))
-------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=324 Card=320 Bytes=11840)
1 0 NESTED LOOPS (Cost=324 Card=320 Bytes=11840)
2 1 TABLE ACCESS (FULL) OF 'DRIVER' (Cost=3 Card=320 Bytes=2560)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'TARGET' (Cost=2 Card=1 Bytes=29)
4 3 INDEX (UNIQUE SCAN) OF 'T_PK' (UNIQUE) (Cost=1 Card=1)
Execution Plan (9.2.0.6 autotrace - range scan on inner table (new option))
---------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=322 Card=319 Bytes=11803)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TARGET' (Cost=2 Card=1 Bytes=29)
2 1 NESTED LOOPS (Cost=322 Card=319 Bytes=11803)
3 2 TABLE ACCESS (FULL) OF 'DRIVER' (Cost=3 Card=319 Bytes=2552)
4 2 INDEX (RANGE SCAN) OF 'T_PK' (UNIQUE) (Cost=1 Card=1)
그림1. Nested Loop Join
그림2. 인덱스를 경유한 Nested Loop 조인