[위로]

<원인>

<SQL문>

 

<조치 사항>

  1. Open 초창기에는 Hint 없이 SQL 작성 (옵티마이져의 판단을 우선)
  2. 튜닝이 필요할 경우 (옵티마이져의 판단을 무시, Hint 지정,Loop,Hash,Merge로 지정)

<기타>

  1. 중첩 루프 조인(Nested Loop Join) Loop
  2. 중첩 루프 조인(Nested Loop Join)에서는 우선 테이블 중 하나를 스캔합니다. 이 때 그 테이블의 모든 행에 대하여 두 번째 테이블을 조회하여 일치되는 행을 검색합니다. 이 경우에 두 테이블을 외부(Outer) 입력 및 내부(Inner) 입력이라고 부릅니다. 외부(Outer) 입력의 각 값마다 내부(Inner) 입력을 스캔하여 일치하는 것을 찾는 것이 바로 기본 알고리즘입니다. 내부(Inner) 입력에 인덱스가 있으면 조회를 훨씬 효과적으로 실행할 수 있습니다. 인덱스가 있는 중첩 루프 조인(Nested Loop Join)은 분명히 인덱스가 없는 중첩 루프 조인(Nested Loop Join)보다 더 효과적입니다. 또한 테이블이 일대일 관계에 있는 경우 내부(Inner) 테이블을 스캔하다가 외부(Outer) 테이블의 행과 일치하는 행을 찾으면 스캔 작업을 종료합니다.
    부동 조건의 조인을 포함하는 이러한 방법을 사용하여 모든 쿼리를 처리할 수 있습니다. (MS내용 http://support.microsoft.com/kb/q197297/)
  3. - 조인되는 테이블들의 조인 컬럼중 어느 한쪽 테이블에만 인덱스가 존재할 때
    - 사용 방법 : 적은 테이블 inner loop join 많은 테이블 (테이블 순서를 바꾸면 성능이 저하됨)
    - select * from sales st inner loop join stores sa on st.stor_id = sa.stor_id
      select * from stores st inner loop join sales sa on st.stor_id = sa.stor_id
  4. - Hint를 사용하지 않으면 옵티마이져가 테이블 순서를 결정함

  5. 해시 조인(Hash Join)
    - 조인을 하기에 적합한 인덱스가 존재하지 않을 때
    1. 해시 일치에서는 반복적인 임의 추출 함수를 사용하여 입력 중의 하나에 대해 Build Input 메모리에 해시 테이블을 작성합니다. 그리고 이 테이블에 다른 입력(Probe Input)과 일치되는 값이 있는지 검색합니다. 해시 테이블은 인덱스와 같은 기능을 합니다. Build Input의 데이터는 메모리에 저장됩니다. 이 때 Build Input의 크기가 메모리에 맞지 않는 경우 메모리에 맞을 때까지 반복적으로 분할됩니다. 그리고 나서 Probe Input을 해시하여 일치하는 것이 있는지 검색합니다. 중첩 루프와는 달리 인덱스의 유무가 그렇게 중요한 것은 아닙니다. 중첩 루프와 비교했을 때 해시 조인은 CPU를 많이 사용하며 사용 가능한 메모리 공간의 영향을 받습니다. 해시 조인은 조인할 테이블의 크기가 많이 차이나는 경우 더 효과적으로 작용합니다.
    2. 해시 조인에서 Build Input은 반복 횟수를 결정하게 되는데, 이는 입력이 메모리 크기에 맞게 되면 분할을 멈추기 때문입니다. 그룹화 특성이 조인 특성과 일치하는 경우 단일 해시 조인은 그룹화와 조인을 동시에 수행할 수 있습니다. 이 조인의 결과에는 어떤 특정 순서가 있는 것이 아닙니다. 이러한 유형의 조인은 부동 조건을 만족시킬 수는 없습니다.
  6. 정렬 병합 조인(Sort-Merge Join)
    - 정렬 병합(Sort-Merge)에서는 다량의 입력을 정렬하면 총 비용이 많이 듭니다. 병합(Merge) 조인에서는 조인 열로 입력을 정렬하여 정렬한 쌍을 하나로 병합(Merge)하는데, 이 과정에서 정렬한 결과 집합과 일치하지 않는 열(Column) 값은 없애 버립니다.

    이 알고리즘은 먼저 한 입력을 검사하고 나서 크거나 같은 조인 값을 가진 행을 찾을 때까지 두 번째 정렬한 입력을 스캔합니다. R1의 튜플을 R2에 있는 모든 튜플과 짝을 지어 조인값을 일치시킵니다. R1에 있는 모든 튜플에 대해서도 이 과정을 반복합니다.

    병합(Merge) 조인은 둘 중에서 더 작은 입력만 메모리에 두는 해시 조인과는 반대로 두 개의 입력이 모두 메모리에 있어야 합니다. 병합(Merge) 조인은 입력이 이미 정렬되어 있는 경우 훨씬 더 효과적입니다. 또한 이 조인의 결과는 조인 특성에서 정렬됩니다. 이러한 유형의 조인은 부동 조건을 만족시킬 수는 없습니다.