조인의 연결고리
|
조인이란 결국 집합을 연결고리(조인조건)를 통해 서로 연결하는 것이기 때문에 연결고리 상태가 조인에 커다란 영향을 미친다.
|
|
조인 조건의 연결고리가 정상이라는 의미는 조건절에 기술되는 조인의 연결조건에 Index가 모두 존재하고 있는 상태를 말한다.
여기서 말하는 Index가 정상적인 상태라는 말의 정확한 의미는 연결을 시도할 때 SQL의 조건절에서 이미 주어진 상수값이나
앞서 액세스한 집합의 결과에서 제공받아 상수값이 된 것들을 이용해 대응되는 집합을 액세스할 때 Index에 문제가 없는 상태를 말한다.
- 연결고리 정상일 경우 양방향 모두 논리적 랜덤 액세스의 총 횟수는 동일하다.
- 1 : M 관계에서 M 쪽에 Optional로 정의 시 경우 M->1 로 갈 때 100%로 액세스 할 수 있지만
1->M으로 갈 경우 데이터가 없을 수 있어 불필요한 액세스가 발생할 수 있다.
- 따라서 연결고리 정상의 경우 처리조건이 조인의 방향을 결정한다.
|
|
Index가 Table A는 없고 Table B에만 존재한다고 가정할 경우 조인방향에 따라 성능이 결정된다.
㉮ Table A -> Table B로 처리경로를 잡을 경우
|
|
       ㉯ Table B -> Table A로 처리경로를 잡을 경우 |
|
Table B의 개수만큼 Table A를 전체 스캔(Full table scan)을 한다. 만약 Table B의 데이터가 100건이고 Table A가 100만 데이터가 있는 회원 테이블일 경우 Table A를 100번 전체 테이블 스캔을 한다. 따라서 이러한 연결고리 이상이 발생 시 Optimizer는 Index가 없는 Table A를 먼저 구동하여 ㉯와 같은 현상을 방지한다.
|
  mysql > select * |
         -> from A, B |
         -> where A.no = B.no |
        -> and A.name like '김%'; |
|
|
Table A의 no 컬럼의 데이터 타입이 int이고 Table B의 no 컬럼의 데이터 타입이 char이면 연결고리의 데이터 타입이 일치하지 않아 연결고리 이상이 발생한다.
|
|
양쪽 연결고리 모두에 Index가 없다면 어느 방향으로 처리하든 연결고리 이상 상태가 되어 많은 수의 전체 테이블 스캔이 발생된다. 일반적으로 Optimizer는 연결고리의 상태에 영향을 받지 않는 소트머지(Sort merge)나 해시(Hash) 방식으로 실행계획을 수립하여 이런 문제점이 발생하는 것을 방지한다. 하지만 소트머지 및 해시를 지원하는 않는 DBMS의 경우 Nested Loops 조인을 수행한다.
|