메뉴 건너뛰기

bysql.net

2.1.조인과 반복연결(loop query)의 비교

- 반복연결 Loop Query = 전형적인 방법으로 한건씩 Fetch하여 연결하는 방식

- 조인은 집합의 연산 개념이므로 어느 집합이 주가 되고 부가 되지 않는다.

- 옵티마이저에 의해 선형되는 집합이 결정된다.

- 조인은 어떤 절차로 수행되더라도 결과는 동일하고, 절차(처리)에 따라 일의 양은 매우 큰 차이가 난다.

- 현업 및 사안에 따라 대부분을 조인으로 Declare에서 처리하고, 아주 특수한 경우만 Loop 에서 처리하는게 좋다.

 

2.1.1. 전체범위 처리 방식에서의 비교

- [ 책 Page 501, 그림 2-2-1 참조 ] - 조인처리와 반복연결

- 조인처리 : 한번의 연결로 전체범위를 처리하여도 원하는 만큼 가공을 하고 운반 단위 만큼 추출할 수 있다.

- 반복연결 : 최종 결과가 100건의 데이타를 추출한다면 DB 연결을 총 101번을 해야 한다.

    한번 연결로 전체 범위 데이타를 추출하고, 프로그램언어에서 건별로 다시 DB에 접속하여 데이타를 추출해야 한다.

    => DB 연결 부하

    => 프로그램언어에서 데이타 가공

    => 불필요한 작업과 DB 연결 부하가 증가 한다.

- 필요에 따라선 SQL를 분리하여 반복연결 형태도 사용할수 있다. 하지만, 한번의 SQL으로 모든걸 처리할수도 있다.

1) 인덱스가 아닌 컬럼으로 Order By( Page 505. 그림 2-2-2 참조 )

SELECT a.fld1, ......................, b.col1, ..........

FROM tab2 b, tab1 a

WHERE a.key1 = b.key2 AND a.fld1 = '10'

ORDER BY a.fld2;

인덱스가 없는 a.fld2 의 정렬시도로 전체 범위처리로 진행이 된다.

반복 연결은 tab1에서 데이타를 추출하고 tab2에서 필요한 건만 추출하기 때문에 tab2는 전체 범위 처리가 되지 않아도 된다.

이 경우 인라인뷰를 사용하여 간단히 처리 할 수 있다.

SELECT a.fld1, ......................, b.col1, ..........

FROM (SELECT fld1, .... FROM tab1 WHERE fld1 = '10' ORDER BY fld2) b, tab2 a

WHERE a.key1 = b.key2;

 2) 1차 가공 결과로 다른 집합을 연결할고자 하는 경우( Page 507. 그림 2-2-3 참조 )

SELECT b.부서명, sum(a.매출액) FROM tab1 a, tab2 b

WHERE a.부서코드 = b.부서코드 AND a.매출일 LIKE '200503%'

GROUP BY b.부서명;

부서별로 매출액을 구하는 SQL이다. 부서(TAB2)와 매출(TAB1)은 1:M의 관계이다. TAB1을 가공할때마다 조인으로 TAB2를 액세스 할 필요는 없다. TAB1 을 먼저 가공하고, TAB2를 액세스 하면 된다.

SELECT b.부서코드, b.부서명, a.매출액

FROM (SELECT 부서코드, sum(매출액) 매출액 FROM tab1 WHERE 매출일 like '200503%'

              GROUP BY 부서코드) a, tab2 b

WHERE a.부서코드 = b.부서코드;

3) 연결해야 될 대상이 상황에 따라서 달라지는 경우( Page 508. 그림 2-2-4 참고 )

그림 2-2-4와 같은 모델에서 조인을 한다면 각 대상을 모두 아우터 조인으로 처리해야 한다.

SELECT a.*, decode(a.입출고구분, '1', b.거래처명, '2', c.공정명, d.창고명) 입출고처명

FROM 입출정보 a, 거래처 b, 공정 c, 창고 d

WHERE a.입출일자 like '200503%'

AND b.거래처코드(+) = decode(a.입출고구분, '1', 입출고처코드)

AND c.공정코드(+) = decode(a.입출고구분, '2', 입출고처코드)

AND d.창고코드(+) = decode(a.입출고구분, '3', 입출고처코드);

이 SQL은 입출정보를 100건이라면, 입출정보-거래처 100건, 입출정보-공정 100건, 입출정보-창고 100건.. 모두 300건을 액세스하게 된다.

( 아웃터 조인이므로 100% 성공하게 되어 있다 )

이 경우에는 반복연결을 사용하여 처리한다면 유리한 점이 있다.

 

2.1.2. 부분범위 처리 방식에서의 비교

필요한 부분만큼 가공하여 다른 집합과 연결하기 때문에 반복 연결의 이점도 분명하게 있다.

처음 조인과 반복 연결의 비교에서 나왔듯이 반복연결은 해당 건수만큼 다시 DB 연결을 하기때문에

조인이 더 유리하다. 그리고, DB에서 제공되는 여러가지 기능을 같이 쓸수 있어 반복연결보단 더더욱 유리할수밖에 없다.

 

--

정확하게 알고 쓰는 조인과 반복연결은 조인이 유리할 수 밖에 없다.

하지만, 어설프게 사용되는 조인과 반복연결은 조인을 하면 무조건 느리다.라는 이야기가 나올수 있다.