DB2에 존재하는 Hybrid Join이 어떤 방식으로 이루어 지는지 알고 싶은데-_-;;
답변 좀 부탁드리겠습니다.
<Nested Loops, Sort Merge, Hash> Jion방식과는 다른 방식인듯 한데..
일반적으로 데이터를 연결하는 방법중에 하나로 조인이라는 것이 있습니다. 그중에서는 크게 Nested Loop Join, Sort Merge Join, Hash Join, Star Join 등이 있겠네요. Hybrid Join 이라는건 분명 Nested Loop Join과 Sort Merge Join이 믹스 되있는 형태 입니다. 위에 말씀드린 NL과 MJ은 설명 드리지 않아도 잘 아시고 계실꺼라 생각 되어지므로,
Hybrid Join에 관해서만 간략하게 설명을 드리겠습니다.
우선 아래와 같은 SQL문이 있다고 가정합니다.
Select A.col1,A.col2, B.col1, B.col2
From tab1 A, tab2 B
WHERE A.col1='a'
and A.col1=B.col1
tab1과 tab2의 테이블에서는 각각 col1을 인덱스로 가지고 있답니다.
tab1의 col1은 인덱스가 정렬되 있는 상태 즉 클러스터링 된 상태이고,
tab2의 col2은 인덱스가 정렬되어 있지 않다고 가정했을때,
만약 Nested Loop 조인을 했을때, 데이터 량이 적으면 상관 없을 수 있겠지만 데이터의 양이 많은 경우에, 먼저 상수 조건인 col1의 인덱스를 타서 tab1의 데이터를 획득수 정렬되있지 않은 tab2의 col1을 랜덤 액세스 합니다. tab2의 데이터 량이 많은경우 수많은 블록을 랜덤 액세스 해야 하는 경우가 발생할수 있습니다.
만약 Sort Merge 조인으로 실행계획이 세워지는 경우에, tab1과 tab2의 테이블을 인텍스 순으로 sort합니다. 그후 sort되어진 각각의col1을 통해 Merge하게 됩니다, 만약 A.col1='a'에 해당하는 로우수가 대부분인 경우에는 유리한 실행계획이지만, 반대로 로우수가 적으면 그만큼 불필요한 access가 발생하는 결과를 초래 합니다.
Hybrid 조인으로 실행계획이 세워지는 경우에는 우선 먼저 드라이빙 되는 테이블이 상수값을 비교하는 테이블.tab1을 A.col1 부분 인덱스 스켄합니다. 그담에, tab2는 Sort Merge 조인에서 처럼, A.col1에 대응되는 B.col2의 RowId를 획득해서 sort한 후 Merge합니다.
경우에 따라서, Hybrid Join이 힘을 발휘 할 수 있겠네요.
감사합니다 :-)