메뉴 건너뛰기

bysql.net

2.3. 조인 종류별 특징 및 활용방안

 

■ 조인의 종류

  • Nested Loops 조인 : 집합을 액세스하여 상수값을 만들고 그것을 이용해 대응되는 집합을 찾는 것
  • Sort Merge 조인 : 서로 연결하기 좋도록 미리 선행작업을 수행 후 서로를 대응시켜 가는 방법

 

2.3.1.  Nested Loops 조인

Nested Loops 조인은 먼저 액세스한 결과를 다음의 액세스에 상수값으로 제고해준다.

이러한 이유 때문에 가장 전통적인 방법이면서 가장 보편적으로 사용되는 조인 방식이라 말한다.

 

 

2.3.1.1. Nested Loops 조인의 기본 개념

 

■ Nested Loops 조인의 기본 예

SELECT a.FLD1,  ... ... ... ... ... ... ... ,  b.COL1  ... ... ... ... ...

FROM   TAB1  a,  TAB2  b

WHEE  a.KEY1 =  b.KEY2

   AND  a.FLD1  =  '111'

   AND  a.FLD2  like  'AB%'

   AND  b.COL1  =  '10';

 

여기서 TAB1과 TAB2는 M:1 관계에 있으며, 연결고리는 정상이고, 상수값을 조건으로 받고 있는 컬럼들은 각각 독립적으로 인덱스를 가진다고 가정한다.

 

■ SQL 수행

 

2-2-14.jpg

 

1. TAB1의 FLD1 인덱스를 경유하여 FLD1  =  '111' 인 처리범위 중 첫 번째 로우를 액세스 한다.

2. FLD1 인덱스에 있는 ROWID에 의해 TAB1의 로우를 액세스한다. 액세스된 상수값을 FLD2 LIKE 'AB%' 조건을 체크한다.

3. TAB1의 KEY의 상수값을 이용하여 TAB2의 KEY2 인덱스로 대응되는 인덱스 로우를 찾는다.

4. KEY2 인덱스에 있는  ROWID에 의해 TAB2 로우를 액세스한다.

5. COL1  =  '10'을 확인하고 조건을 만족하면 결과를 운반단위로 보낸다.

6. 이렇게 한 싸이클이 돌면 다시 FLD1 인덱스의 두 번째 로우를 읽어 위의 작업을 반복한다.

 

■ 종합

모든 컬럼에 인덱스가 있더라도 수행 절차에 따라 인덱스가 사용될 수도 있고 단순히 체크 조건 역할만 할 수 있다.


 

가) Nested Loops 조인의 특징

1) 순차적

선행 테이블(Driving table)의 처리범위의 로우들이 순차적으로 수행되며 테이블간의 연결도 순차적이다.

 

2) 선행적

- 먼저 액세스되는 테이블의 처리범위에 의해 처리량이 결정된다.

- 즉,  선행 집합의 처리범위가 전체 일의 양을 결정한다. 

 

3) 종속적

나중에 처리되는 테이블은 앞서 처리된 값을 받아 액세스된다.

 

4) 랜덤 액세스

- 선행 테이블의 인덱스를 액세스시  첫 번째 로우만 랜덤 액세스고 나머지는 스캔이다.

- 그러나 연결작업은 모두 랜덤 액세스이다.

 

5) 선택적

- 조건에 있는 모든 컬럼들에 인덱스가 있더라도 모두 사용되지 않는다.

- 연결되는 방향에 따라 사용되는 인덱스가 달라진다.

 

6) 연결고리 상태, 방향성

- 연결고리가 되는 인덱스에 의해 연결작업이 수행되므로 연결고리 상태가 중요하다.

- 연결고리의 인덱스 유무에 따라 액세스 방향 및 수행소도에 많은 차이가 발생된다.

 

7) 부분범위 처리 가능

- 선행 집합의 하나의 로우를 대상으로 연결하기 때문에 부분범위 처리가 가능하다.

 

8) 체크조건의 영향력

- 부분범위처리의 경우 조건의 범위가 넓을수록 빨리 운반단위를 채울 수 있어 수행 속도가 빠르다.

- 전체범위 처리일 때는 가공 대상이 많아 수행속도가 나빠진다.

 

나) Nested Loops 조인의 적용기준

- 부분범위처리를 하는 경우에 유리하다

- 조인되는 어느 한쪽이 상대방 테이블에서 제공한 결과를 받아야만 처리범위를 줄일 수 있는 상황일 경우

- 처리량이 적은 경우 (많더라도 부분범위처리가 가능한 경우)

- 연결고리에 이상이 없는 경우

- 먼저 수행한 집합의 처리범위에서 많은 처리 범위를 줄여줄 경우

- 부분범위처리시 운반단위가 적을 경우

- 액세스로 인해 메모리 사용을 과도하게 요구하는 경우

 

 

2.3.1.2. Nested Loops 조인의 순서결정

  • 조인 순서에 의해 조인의 효율이 달라진다.  ⇒  고로 조인의 순서가 중요함
  • 가장 큰 영향은 최초 수행되는 선행집합이다.
  • 연결고리의 상태가 정상이라면 방향은 무관하다. 단, 초기에 많은 범위를 줄여줄 수 있는지 고려한다.

 

 

◆ 조인 순서에 따른 결과

 

■ SQL 예문

SELECT   ... ... ... ... ... ... ...

FROM  TAB1  x,  TAB2  y,  TAB3   z

WHERE x.A1  =  y.B1

   AND  z.C1  =   y.B2

   AND  x.A2  =   '10'

   AND  y.B2  LIKE  'AB%' ;

 

(1) TAB1  →  TAB2  →  TAB3 

 순 서

 ACCESS PATH 

 상수값 찾기

TAB1 x

A2  =  '10

y.B1 , z.C1 이 미지수로 A2 = '10'만 액세스 가능 

TAB2 y

B  =  A1  and  B2  LIKE  'AB%'

A1은 위에서 읽혀져 상수값이 됨 / y.B1 = x.A1 액세스 가능

y.B2 = z.C1은 z.C1이 미지수로 액세스 불가능

y.B2 LIKE 'AB%' 는 액세스 가능

TAB3 z

C1  =  B2

z.C1 = y.B2 액세스 가능

 

(2) TAB2  →  TAB3  →  TAB1

 순 서

ACCESS PATH

상수값 찾기

TAB2

B2  LIKE  'AB%'

x.A1 , z.C1 이 미지수로 y.B2 LIKE 'AB%'만 액세스 가능 

TAB3

C1  =  B2

x.A1 이 미지수로 z.C1 = y.B2가 액세스 가능

TAB1

A1  =  B1  and  A2  =  '10'

액세스 되지 않은 모든 경우 액세스 가능 / x.A1 = y.B1 , x.A2 = '10' 액세스 가능

 

(3) TAB3  →  TAB2  →  TAB1

 순 서

ACCESS PATH

상수값 찾기

TAB3

FULL  TABLE SCAN

액세스에 참여할 수 있는 조건이 없어 풀스캔을 한다.

TAB2

B2  =  C1  and  B2  LIKE  'AB%'

x.A1 , x.A2 = '10' 이 미지수이고 z.C1 = y.B2 , y.B2 LIKE 'AB%' 액세스 가능

TAB1

A1  =  B1  and  A2  =  '10'

액세스 되지 않은 모든 경우 액세스 가능 / x.A1 = y.B1 , x.A2 = '10' 액세스 가능

 

 

 위와 같이 조인의 경우 순서에 영향을 많이 받는다.

 

 

 ◆ 조인의 순서를 정하는 방법

  1. 조인하는 집합 중에서 제일 하위의 집합을 찾는다.
  2. 하위 집합들이 확보할 수 있는 조건들을 찾는다.
  3. 위 2가지의 조건 중에 처리범위를 많이 줄일 수 집합을 찾는다.
    (우열을 가릴 수 없다면 소트머지 조인이나 해쉬조인으로 수행하는 것이 좋다)