Background Image
기타
2009.12.31 19:32

조인 방법(Join Method) 설명

조회 수 27995 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

조인 방법(Join Method) 설명.

2009-12-23 컨설팅팀, CUBRID

적용 대상: CUBRID

적용 환경

본 문서는 아래와 같은 환경에서 테스트 되었다.

CUBRID R1.0 이상


 

Join Method 개요

CUBRID 에서 지원하는 Join Method에는 두가지가 있다.

중첩 반복 조인 ( Nested Loop Join )

정렬 병합 조인 ( Sort Merge Join )

대부분의 DBMS도 마찬가지로 두가지 종류의 Join Method를 지원하고 있으며 타 DBMS의 경우 부가적으로 Hash Join 기능을 제공하기도 한다. CUBRID 의 경우 인터넷 서비스에 유리한 중첩 반복 조인(NLJ) 을 사용하는 것이 정렬 병합 조인( Sort Merge Join ) 이나 해쉬 조인( Hash Join ) 을 사용하는 것보다 OLTP 성 온라인 서비스를 하는 경우에 적합하다고 할수 있다.

Join Method 비교

중첩 반복 조인( Nested Loop Join )

중첩 반복 조인의 경우 다음과 같은 로직으로 실행 된다. NLJ 특성상 OLTP 서비스에 유리하다.

For each tuple in R as r do

     For each tuple in S as s do

        If r and s satisfy the join condition

           Then output the tuple <r,s>

1)    수행 방식 설명

 K-1.png

 

2)     특징 정리

특징

설명

순차적

두 테이블간의 연결 및 최종 운반 단위 산출까지 순차적으로 진행 된다.

선행적

선행(Driving) 테이블의 처리 범위가 전체 일의 양을 결정 한다. , 후행(Driven) 테이블의 경우 선행 테이블의 처리 범위가 적을수록 비교해야 하는 범위가 줄어 든다고 할 수 있다.

종속적

후행(Driven) 테이블의 경우 선행 테이블의 결과를 받아서 처리 결과를 만들게 된다. , 선행테이블의 범위에 영향을 크게 받는다.

연결 고리의 중요성

선행 테이블과 후행 테이블간에 연결 고리 (인덱스)가 있는 경우와 없는 경우간의 성능 차이가 크다.

부분 범위 처리

NLJ 특성상 부분범위 처리에 유리 하다.

3)     고려 사항

l  조인에 사용된 인덱스 구성을 고려해야 한다. 여러 개의 테이블이 조인 수행 연결고리의 인덱스 가용 여부에 영향을 받는다.

l  선행 테이블(Driving Table) 영향을 크게 받으므로 선행 테이블 선정이 매우 중요 하다.

l  대부분이 OLTP 질의에 사용되며 부분 범위 처리가 있도록 조건 절에 유의 하여 사용한다.

l  전체 범위 처리가 경우 RANDOM I/O 많아져 오히려 늦을 있다.

정렬 병합 조인( Sort Merge Join )

정렬 병합 조인(Sort Merge Join) 경우 , 우변의 조건을 만족하는 조건을 Sequential I/O 사용하여 결과셋을 만든 , 우변 key 값으로 비교하여 merge 하는 방식을 사용한다. 좌우 변의 결과 셋이 경우 ($CUBRID/conf/cubrid.conf 파일의 sort_buffer_pages 설정한 page 보다 결과 셋이 경우를 뜻함) TEMP volume 사용하며 성능상의 문제가 발생할 있다. 일반적으로 정렬 병합 조인의 경우 OLTP 질의 보다는 배치성 통계 작업에 유리 하다.

1)    수행 방식 설명

 

 K-2.png

CSQL 을 사용한 정렬 병합 조인 플랜 생성 예)

csql>;set level 514

csql> select /*+ USE_MERGE ( tab1 tab2 ) */ tab2.col1 from tab2 , tab3                                                                                                                      where to_number(tab2.col1) = tab3.col1 and tab2.col1 > '5000' and tab3.col1 > 3000;

csql> ;x

Join graph segments (f indicates final):

seg[0]: [0]

seg[1]: col1[0] (f)

seg[2]: [1]

seg[3]: col1[1]

Join graph nodes:

node[0]: tab2 tab2(10000/224) (sargs 2)

node[1]: tab3 tab3(10000/201) (sargs 1)

Join graph equivalence classes:

eqclass[0]: term[0]

Join graph edges:

term[0]: tab3.col1= to_number(tab2.col1) (sel 0.0001) (rank 3) (join term) (mergeable) (inner-join) (indexable col1[1]) (loc 0)

Join graph terms:

term[1]: tab3.col1 range (3000 gt_inf max) (sel 0.1) (rank 2) (sarg term) (not-join eligible) (indexable col1[1]) (loc 0)

term[2]: tab2.col1 range ('5000' gt_inf max) (sel 0.1) (rank 2) (sarg term) (not-join eligible) (indexable col1[0]) (loc 0)

Query plan:

temp

    order: UNORDERED

    subplan: m-join (inner join)

                 edge:  term[0]

                 outer: temp

                            order: phony (term[0])

                            subplan: iscan

                                         class: tab2 node[0]

                                         index: pk_tab2_col1_col2 term[2]

                                         cost:  fixed 30(0.0/30.0) var 19(3.0/16.0) card 1000

                            cost:  fixed 79(8.0/70.9) var 6(2.5/3.9) card 1000

                 inner: temp

                            order: phony (term[0])

                            subplan: iscan

                                         class: tab3 node[1]

                                         index: pk_tab3_col1_col2 term[1]

                                         cost:  fixed 28(0.0/28.0) var 18(3.0/15.0) card 1000

                            cost:  fixed 76(8.0/67.9) var 6(2.5/3.9) card 1000

                 cost:  fixed 155(16.0/138.8) var 638(630.0/7.8) card 100

    cost:  fixed 798(651.0/146.6) var 1(0.2/1.0) card 100

Query stmt:

select /*+ USE_MERGE */ tab2.col1 from tab2 tab2, tab3 tab3 where tab3.col1= to_number(tab2.col1) and (tab2.col1> ?:0 ) and (tab3.col1> ?:1 )

 

2)    특징 설명

 

동시적

Nested Loops 조인에서는 한쪽 테이블이 읽혀져야(선행 테이블) 후행 테이블을 액세스 할 수 있다. , 순차적으로 액세스 되었다.  하지만, 이 조인 방식은 양쪽 테이블을 동시에 읽고 양쪽 테이블이 조인할 준비가 되었을 때 조인을 시작한다.

독립적

NLJ 과 같이 선행 테이블의 처리 결과와 상관 없이 SMJ의 경우 각자 테이블이 가지고 있는 필터링 조건이 실행 성능에 큰 영향을 미친다.

전체 범위 처리

정렬 작업이 완료된 이후에 처리 되므로 부분 범위 처리가 이루어 지지 않는다.

연결 고리

SMJ의 경우 연결고리 보다는 각자가 가지고 있는 필터링 조건(상수) 의 영향을 받는다.

부분 범위 처리

SMJ 의 경우 소트하여 처리한 후에 결과셋을 만드는 작업을 하므로 부분 범위 처리 되지 않으며 일반적으로 통계성 작업이나 배치(Batch) 작업에 주로 사용된다.

 

 


 

3)    고려 사항

l  통계 작업이나 배치성 작업 처럼 처리량이 많은 질의에 사용 한다.

l  대량 Sort 작업시 TEMP Volume 사용하므로 OLTP 업무에 적당하지 않다.

 

참고 자료

대용량 데이터 베이스 솔루션 1

새로쓴 대용량 데이터 베이스 솔루션

 


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
166 기타 [10.2 path] - 생성된 view구문을 'show create view' 수행 시 정상적으로 출력되지 않던 이슈 patch 큐브리드_김주현 2020.11.09 891
165 기타 큐브리드10.1 에서 윤초 지원 옵션 사용하기 최광일 2017.09.13 1420
164 Linux <주의> 생성한 DB볼륨을 절대! 삭제하지 말자 큐브리드_김주현 2019.09.30 1604
163 Install [linux] wget으로 제품 다운로드 시 "wget: unable to resolve host address ‘ftp.cubrid.org’" 해결방 큐브리드_김주현 2021.07.02 2274
162 기타 ERwin을 이용한 CUBRID 포워드 엔지니어링 file 민순 2020.07.14 2320
161 기타 따라하면 쉬운 compactdb 사용법 file 허서진 2017.07.01 2532
160 기타 ERwin을 이용한 CUBRID 리버스 엔지니어링 file 민순 2020.07.13 3468
159 Java JDBC를 사용한 다중화 구성 SELECT Query 부하 분산 가이드 file 윤준수 2017.03.30 3948
158 튜닝 다중컬럼 조건에 대한 인라인뷰 처리방안 2 박동윤 2016.12.27 6013
157 기타 PyCharm을 이용한 CUBRID, Django 연동 가이드 file 진우진 2016.04.11 8153
156 Java CUBRID에서 Java AddBatch 사용 엄기호 2016.06.28 8366
155 기타 CUBRID Migration Toolkit을 이용한 단계별 마이그레이션 진행 방법 file 진우진 2015.12.15 9546
154 PHP CUBRID HA 환경에서 Apache-PHP 설정 가이드 이용미 2015.06.16 10665
153 기타 CUBRID isolation level & Dirty Read 정만영 2015.05.29 11315
152 기타 알고 보면 쉬운 cubrid lockdb 유틸리티 file 김승훈 2015.12.08 12086
151 Windows Windows 에 설치 된 JRE 설치 위치 확인 하기. file 성진 2015.05.28 12572
150 기타 데이터 확인에 정규표현식을 사용 해 보자. 성진 2016.03.01 12761
149 기타 CUBRID 2008 R4.0 파라미터 변경 사항 (일부) file admin 2011.07.14 13154
148 Linux 가상머신 환경에서 리눅스 및 큐브리드 설치 가이드 file 이경오 2015.07.14 13405
147 기타 콘솔에서 마이그레이션 하기. file 권호일 2015.06.19 13433
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales