MS-SQL 조인 내부 처리 방식 정리

Posted by 엘키의 주절 주절 on March 26, 2009

참고 자료

용어 정리

  • Driving Table : 조인에서 기준이 되는 테이블 (= Outer Table)
  • Drived Table : 조인에서 결합 되어지는 테이블 (= Inner Table)

Nested Loop

  • 두개 이상의 테이블에서, Driving Table에서 먼저 조건에 맞는 집합을 만들고, Drived Table에서 조건이 맞는 결과를 얻어낸 후 Row를 결합하여 원하는 결과를 추출하는 방식 (Driving Table의 한 행당 Drived Table의 데이터 검색이 일어난다).
  • 부분 범위 처리 가능 (정지, 재개 가능. 예를 들어 조건에 만족하는 데이터 1000개만 얻어낸 상태에서, 요청이 들어올경우 1001~2000번째 값을 얻어오는 것이 가능)
  • Driving Table에서 상대 테이블로 비교할 데이터 량이 적은 것이 효율에 좋다.
  • 기준 테이블과 상대 테이블 간에 서로 대응하는 값에 인덱스가 걸려있는 것이 효율에 좋다.
  • 특정 범위만 알아오는 쿼리에 유용.
  • Any Join에서 사용 됨.

Sort Merge

  • 쿼리에 따라 기준 테이블, 상대 테이블 각각 조인에 포함될 데이터들만 추려내 테이블로 구성한 후 (집합을 구성), 추린 테이블의 데이터를 정렬해서 사용한다. (상황에 따라 테이블 전체를 정렬해서 사용하는 경우도 있다.)
  • 두 테이블의 크기가 다를 경우, 유후 시간 발생 (정렬 되는 시간이 동일하지 않기 때문에)
  • 지그 재그 계단식 비교 방식을 취함 (읽고 있는 데이터 포인터를 기억한 후, 다음 데이터를 읽을 때 이미 읽은 위치를 다시 읽지 않는 방식으로 검색량을 줄인다.)
  • 지그 재그 계단식 비교를 하기에, 겹치는 값이 존재할 경우 이미 읽은 데이터를 다시 읽어야 되는 상황이 발생하기도 한다. (같은 값이 여러개일 경우, 방금 읽었던 값도 또 읽어야 하기에) 그래서, 겹치는 값이 존재할 경우 DBMS가 Hash Join을 사용할 가능성이 높다.
  • 추려진 결과가 한번에 나오고, 그 전에는 결과를 낼 수 없기에, 처리 속도가 중요한 쿼리에서는 사용되지 않는다.
  • Any Join 에서 가능 하지만 주로 Equal Join 에서 유용.

Hash

  • 테이블 내의 모든 데이터에 해시 함수를 적용하여 해시 버킷에 담는다. 값 별로 버킷에 나누어 담기에, 해당 버킷을 읽음으로써 같은 값을 사용하는 집합에 억세스 하는 방식이다.
  • 해시 테이블 구성 비용 (CPU, 메모리)이 크다.
  • 값 별로 버킷에 담기기에 버킷 억세스는 같은 값을 찾는 경우에만 빠르다. 그래서, Equal Join 에서만 가능하도록 되어있다.