NLJ, Nested Loop Join은 중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방법이다.
랜덤 접근에 대한 비용이 많이 증가하기 때문에 대용량 테이블에선 사용하지 앟는다.
t1와 t2를 토인한다고 하면, t1에서 행을 하나 읽고, t2에서 for문을 통해 행을 하나씩 읽으면서 조건에 맞는 레코드를 찾는다.
NLJ에서 발전한 방법으로, 조인할 테이블을 작은 블록으로 나눠 블록 하나씩 조인하는 블록 중첩 루프 조인 BNL도 있다.
각 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후 조인 작업을 수행
조인할 때 쓸 적절한 인덱스가 없고 대용량의 테이블을 조인하고 조인 조건으로 <,>등 범위 비교 연산자가 있을 때 쓴다.
해시 테이블을 기반으로 조인하는 방법.
두 개의 테이블 조인시 하나의 테이블이 메모리에 온전히 들어가면 NLJ보다 효율이 좋다.
동등 조인에서만 사용할 수 있다.
입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드한다.
t1과 t2 테이블을 조인할 때 바이트가 더 작은 테이블을 기반으로 테이블을 빌드한다. t2가 더 작다고 가정한다.
조인에 사용되는 필드(t2_id)가 해시 테이블의 키로 사용된다.
빌드 단계 후 프로브 단계 동안 레코드 읽기를 시작하며, 각 레코드에서 t2_id에 일치하는 레코드를 찾아서 결과로 반환한다.
이를 통해 각 테이블은 한 번씩만 읽고, 중첩해서 두 개의 테이블을 읽는 중첩 루프 보다 성능이 보통은 더 좋다.
사용 가능한 메모리 양은 join_buffer_size라는 시스템 변수에 의해 제어된다.