메뉴 건너뛰기

bysql.net

2.2 연결고리 상태가 조인에 미치는 영향

연결고리 상태란 : 주어진 조인 조건의 연산자의 형태와 그들이 가지고 있는 인덱스의 상태

  

 

 

2.2.1. 연결고리 정상(正常)(바를 정, 항상 상)

연결고리 정상의 의미 : 조건절에 기술되는 조인의 연결조건에 인덱스가 모두 존재하고 있는 상태

인덱스가 정상적인 상태 의미 : SQL에서 주어진 상수값이나, 제공받은 상수값을 이용하여 액세스할 때 인덱스에 문제가 없는 상태

 

1. 연결고리 정상 예 1

 

 2-2-6.jpg

 

■ 설명

1. TAB1의 처리범위에서 첫 번째 로우를 읽는다

2.TAB2의 연결고리가 되는 인덱스(KEY2)가 있으므로 TAB1의 연결고리의 값('D')에 대응되는 로우를 KEY2 인덱스에서 찾는다.

3.KEY2 인덱스에 있는 ROWID를 이용하여 TAB2의 해당 로우를 찾는다.

4.다시 TAB1의 두 번재 로우를 읽어 위 작업을 반복한다.

 

위와 반대방향으로 처리되는 경우를 보자~~~

2.연결고리 정상 예 2

 

2-2-7.jpg

 

■ 설명

1.TAB2의 처리범위에서 첫 번째 로우를 읽는다.

2.TAB1에 연결고리가 되는 인덱스(KEY1_INDEX)가 있어 TAB2의 연결고리의 값('B')에 대응되는 로우를 KEY1 인덱스에서 찾는다.

3.KEY1 인덱스에 있는 ROWID를 이용하여 TAB1을 읽는다.

4.다시 TAB2의 두 번째 로우를 읽어 위 작업을 반복한다.

 

■ 연결고리 정상의 예 1, 2를 통한 결과

연결고리 양쪽에 인덱스가 존재하는 경우, 어느 방향으로 연결작업을 수행하든 인덱스를 통해 정상적인 연결작업을 수행할 수 있는 경우에 '연결고리 정상' 상태라 부른다.


 

 

2.2.2. 한쪽 연결고리 이상(異常)(다를 이, 항상 상)

연결고리 이상의 의미 : 어느 한쪽의 연결고리에 인덱스(혹은 클러스터)가 없는 경우를 말한다.

 

1. 한쪽 연결고리 이상 예 1

 

2-2-10.jpg 

..

■ 설명

1. 앞의 "연결고리 정상"인 상태의 첫 번재 경우와 동일한 상황

2. KEY1 인덱스는 사용하지 않는다.

3. 영향을 받지 않는다.

 

2. 한쪽 연결고리 이상 예 2

 

2-2-11.jpg

 

■ 설명

1. TAB2에서 처리 할 범위의 첫 번째 로우를 읽는다.

2. KEY2의 값이 상수가 되었으나 연결할 TAB1의 KEY1 에 인덱스가 없어 TAB1을 전체 스캔한다.

3. 스캔중에 대응되는 값을 찾을경우 멈추지 못한다. 대응되는 모든 로우를 추출해야 하므로 TAB1을 끝까지 스캔한다.

4. 다시 TAB2의 두 번째 로우를 읽고 TAB1을 전체 스캔한다. TAB2의 처리범위가 끝날때까지 매번 TAB1을 전체 스캔한다.

 

■ 문제점

1. TAB2 처리범위의 로우 수만큼 TAB1을 전체 스캔한다.

2. TAB2의 KEY2값에 대응되는 값이 없더라도 TAB1을 전체 스캔한다.

 

■ 해결책

1. 연결고리의 어느 한쪽에 이상이 있는 경우 이상이 발생한 테이블을 반드시 먼저 처리한다.

2. 양쪽 모두 연결고리의 인데스를 사용하지 않는 소트머지나 해쉬 조인으로 수행한다.

 

 

3. 양쪽에 정상적인 연결고리가 정의되어 있음에도 연결고리의 이상 상태가 발생되는 경우

가) 조인되는 컬럼이 1:1로 대응되지 않는 경우

..

나) 데이터 타입의 차이에 의해 발생되는 경우

서로 다른 데이터 타입을 가진 컬럼을 조인 조건으로 비교하면서 "내부적인 컬럼의 변형"에 문제가 발생

 

- NUMBER 타입을 기준으로 CHAR 타입을 NUMBER 타입으로 변경시키면서 사용제한이 일어나 문제가 발생

- 연결고리가 되는 컬럼을 DATE 타입으로 했을때도 자주 문제가 발생한다.

 

설계 시에 데이터 타입의 일관성을 유지시키는 것이 매우 중요함

 

 

2.2.3. 양쪽 연결고리 이상(異常)(다를 이, 항상 상)

  • 양쪽 연결고리 모두에 인덱스가 없는 경우
  • 이런 경우 옵티마이져는 소트머지나 해쉬 방식으로 실행계획을 수립한다.
    (억지로 Nested Loops 조인 시도시 엄청난 횟수의  풀스캔이 발생)

  • ..