2015년 5월 11일 월요일

엑세스 최적화 - 조인 처리



위 책을 읽으면서 머리속에 정리한 글
(이론 서적의 경우엔 제 개인적 주관이 다분이 포함해서 작성합니다.)


두 테이블 이상 에서 원하는 데이터를 얻어내는 대표적인 방법이
   조인이지만 데이터를 연결하는 방법은 조인만 있는게 아니다.
  대체 방법으로는  UNION .... GROUP BY 
                서브쿼리(Subquery)
                저장형함수(Stored Function)
                원시적으로 커서(DECLARE CURSOR)로 
                  기준테이블을 Fetch 후 원하는 값을  
                  for .... 형태의 loop 로 엑세스 하는 방법

1. 조인과 반복연결 (Loop query) 의 비교
   데이터 처리의 대부분은 조인을 통해 declare 에서 처리, 
     아주 특수한 경우에는  loop 에서 처리하는 방법이 최상이 아닐까 한다.
   조인문을 쓰면 sql이 한문장이지만 반복연결을 쓰면 해당하는 
     숫자만큼 sql이 실행된다.
   이건 대용량조회시, DBMS가 띨띨한 느림보일시 끔찍한 결과를 
     보여주게 된다.
   다만 대상이 상황에 따라 달라지는 경우, 연결을 했을때 찾는 범위가 
     획기적으로 줄어들시에는 반복연결을 써도 된다.

2. 연결고리 상태가 조인에 미치는 영향 
    (join 되는 테이블이 지니는 인덱스가 제대로 되어 있다면 연결고리는 정상
        한쪽이라도 이상이 있다면 한쪽 이상, 또는 양쪽 이상 이라고 표현)

  1) 연결고리 정상 (양쪽 인덱스가 다 정상적으로 동작)
      테이블1 에서 테이블2 키값을 찾아서 테이블2를 조회시 
      테이블2 에서 테이블1 키값을 찾아서 테이블1을 조회시
      같은 결과물을 끌고오겠지만 차이가 있다 
      첫 테이블을 지난 시점에서 row 숫자가 적은 쪽을 먼저 처리되게끔 해야 좋다
        그 숫자만큼 2테이블을 조회할테니깐 어차피 결과는 같은데...

  2) 한쪽 연결고리가 이상 있는 경우 
     그렇다면 선택의 여지가 없음 되는쪽으로 조회해야함

  3) 양쪽 연결고리에 이상이 있는 경우
      sql 이외의 설정 방법을 강구해야 한다. 
        그대로는 조회 시간을 엄청나게 잡아먹을께 분명하다.

3. 조인 종류별 특징 및 최적화 활용방안
     조인은 크게 두가지로 나눌수 있다.
      한집합 엑세스후 상수 집단을 만들고 이것을 이용해 대응하는 
       집단을 찾아가는 방법
      2 집합을 연결하지 좋은 고리를 만들어 두고 이를 서로에게 
       대응시키는 방법
     큰 범주는 위 2가지 이나 여기에 특수 상황에 대한 장점들을 
       추가하면서 여러 조인 방법들이 발전하고 있다.

  1) Nested Loops 조인
     전통적인 조인 방법, 가장 많이 씀
     첫번째 집합에서 범위를 줄인뒤 다음 집합에 대응하는 방법
     이게 가능하다면 다음 조인방법을 생각하지 말고 이걸 써야함 왜? 
      부분조회가 되니깐 그리고 어느 테이블부터 조건을 걸어 조회할건지 굉장히
      중요하다 왜? 범위를 처음에 많이 줄여야 빠를테니깐

  2) Sort Merge 조인 
     ..1) 방법을 쓰기위해서 2번째 테이블부터 랜덤엑세스를 시도하는데
     각 테이블에서 조건을 적용한뒤 줄인값을 정렬시켜서 서로 대응시키는거
       혹은 각 테이블을 정렬 -> 조건 적용 --> 각 테이블 대응
     동시 조회되어 조회는 빠르지만 정렬한다는게 문제다.
     물론 양쪽 후보자가 적다면 문제가 안되겠지만 항상 그럴수 없기 때문에..
     where 조건이 각자 많이 줄일수 있다면 좋은 선택이다.
     하드웨어가 괴물인 경우에도 좋다. 병렬처리가 되기 때문에
     DBMS 옵션이 ALL_ROWS 인경우 Sort Merge를 잘 시도하지 않는다. 
     이걸로 1)보다 더 성능을 내는 경우는 적지 않을까? 
     적용하기 위해서 하단에 order by 를 모든 테이블에 걸어준다.

  3) Nested Loops 조인 및 Sort Merge 조인 비교하기
     작은거, 기본은 1), 하드웨어가 좋고, 각각 테이블이 where 절로 많지 않은 
       결과물을 내어놓는다면  소트가 좋다. (...2) 가 좀더 사용하기 까다로운듯)

  4) 해쉬 조인
     연결시 해쉬함수를 이용하고, 파티션 단위로 처리되어 대량 처리에 좀더 
       향상된 속도를 제공하며 초대량 엑세스에서도 속도가 많이 떨어지지는 
       않는다.
     메모리 안에 뭔가 정보를 저장해서 이용하는 방법인데 이해되지 않아서 패스

  5) 세미 조인
     서브 쿼리를 사용시 그대로 실행하지않고 DBMS에 의해 메인 쿼리와 
     조인시켜서 실행되는 걸 의미한다. 유형은 ..1)와 비슷하다 다만 테이블
       결과물이 다른 테이블 결과물의 종속성을 가지는지 아닌지의 차이가 있다.

  6) 스타 조인
     여러 테이블 조인시 만약 각각의 테이블이 범위를 조금씩 줄여주는 
       조건을 각각 가지고 있다면 순서를 이리저리 바꿔도 느린 대답에 지치게 
       될 것이다.
     스타조인은 이 각각의 조건에 대응되는 결과값을 먼저 뽑고 각 테이블에 
       붙이는 방법이다.
     방식은 기본1),2)에 벗어나지 않으나 실행 방식의 차이가 있을뿐이라고 한다.
     비용기준 옵티마이저 모드가 꼭 필요하다.
     사용방법은 테이블 조인시 버퍼에 저장하기를 실행해야 하며 실행계획은 
       비용기준에 의거 DBMS가 선택한다. 
       (뭐 직접 통제 안된다는건지 좀 찾아봐야 할듯)

  7) 스타변형(Star Transformation) 조인
     스타조인의 문제점을 해결한 방법, 
       다만 스타조인보다 느리기 때문에 대체되지는 못한다

  8) 비트맵 조인 인덱스(Bitmap join index)
     인덱스보다 빠른 비트맵 을 이용한 방법 뭐 딱히 특별한 내용은 없는듯.

댓글 없음:

댓글 쓰기