본문 바로가기
데이타베이스/Oracle

[Oracle] DB LINK를 이용한 분산 Query의 튜닝시 체크사항

by 로드러너 2013. 11. 13.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

DB LINK를 사용한 분산 쿼리의 튜닝

 

DB LINK를 이용한 분산 DB Query의 경우, 로컬 DB와는 또다른 관점의 튜닝이 필요하다.
개인적으로 체크하는 핵심적인 요소를 4가지로 정리해 봤다.
이하의 4가지 경우는 어느경우든 필수적으로 따라야 하는 요소는 아니지만, 체크되어야 하는 핵심요소들이다.

 

 

1. 가급적 Nested Loop을 피하고, Sort-Merge나 Hash Join처리하여, Network RoundTrip을 줄인다


물론 상황에 따라 다르겠지만 일반적으로 네트웍을 통한 분산 SQL 튜닝에서, 로컬 DB에서만 수행되는 SQL과 튜닝포인트가 다른 점은 분산 DB QUERY의 NETED LOOP 조인은 조인건수만큼의 네트웍 RoundTrip이 발생하므로, 조인건수가 많을 경우 네트웍 RoundTrip에 소요되는 시간이 상당히 많다는 것이다.
그러므로 Nested Loop조인으로 풀리지 않으면 수백만건이상의 테이블에 대한 Full Table Scan등이 발생하는 경우가 아니라면, 되도록이면 Sort-Merge나 Hash Join으로 수행되도록 PLAN을 조정하여, 조인으로 인한 Network Roundtrip을 가급적 줄이도록 한다.

 

 

2. Driving_Site 힌트를 이용하여, 읽혀지는 일량이 많은 DB가 SQL 수행의 주체가 되도록 한다.


예를들어 Remote 사이트의 결과 건수가 100만건 짜리인 테이블과 로컬의 100건짜리 코드 테이블이 조인될 경우Driving_SITE 힌트를 사용하여, 100만건짜리 테이블이 위치한 DB가 조인수행의 주체가 되도록 한다.

 

 

3. 바인드변수나 문자열값의 직접 사용은 PLAN을 고정시키게 된다.

2번과 같이 Driving_Site 힌트를 이용하여 SQL 수행 주체가 되는 DB를 지정하여, PLAN을 조정코자하는 경우에 SQL에 바인드변수나 직접적인 문자열값이 있는 경우 힌트가 원하는대로 적용되지 않는다.
즉, SQL에 SELECT-LIST에 문자열값이나 바인드변수값이 있으면, PLAN상 Remote에서 수행이 되지 않고 항상 로컬에서 수행이된다.

이경우는 문자열이나 바인드변수값을 제외한 SQL을 인라인뷰에서 수행하여, Remote DB에서 해당 SQL이 수행되도록 하고, 인라인뷰 밖에서 필요한 문자열 값을 주고, NO_MERGE 힌트를 사용하도록 한다.

예>

INSERT INTO T3
SELECT /*+ DRIVING_SITE(T1) */
‘ADD_COLUMN’, T1.*, T2.*
FROM T1@LINK1 T1, T1@LINK1 T2
WHERE A.COL1 = B.COL2;

PLAN:
Execution Plan
——————————————————————————–
0 INSERT STATEMENT Optimizer=CHOOSE (Cost=5 Card=3K Bytes=41K)
1 0 VIEW (Cost=5 Card=3K Bytes=41K)
2 1 HASH JOIN (Cost=5 Card=3K Bytes=20K)
3 2 REMOTE (Cost=2 Card=3K Bytes=10K) [LINK1] (SERIAL_FROM_REMOTE)
4 2 REMOTE (Cost=2 Card=3K Bytes=10K) [LINK1] (SERIAL_FROM_REMOTE)

이경우는.., DRIVING_SITE 힌트를 줘도 리모트 DB에서 T1과 T2테이블을 로컬 DB로 읽어와서

로컬에서 조인하게 된다.
이것은 리모트DB에서 조인이 발생해서 결과값만 받는 것이 일반적으로 훨씬 유리하다.
아래와같이 문자열값을 밖으로 뺀 인라인뷰와 NO_MERGE 힌트를 이용하여 원하는 PLAN으로

수정이 가능하다.

INSERT INTO T3
SELECT /*+ NO_MERGE(A) */ ‘ADD_COLUMN’, A.*
FROM (
SELECT /*+ DRIVING_SITE(A) */
T1.*, T2.*
FROM T1@LINK1 T1, T1@LINK1 T2
WHERE A.COL1 = B.COL2) A;

PLAN:
Execution Plan
——————————————————————————–
0 INSERT STATEMENT Optimizer=CHOOSE (Cost=5 Card=100 Bytes=400)
1 0 VIEW (Cost=5 Card=100 Bytes=400)
2 1 REMOTE [LINK1] (SERIAL_FROM_REMOTE)

 

 

4. 뷰를 이용하여, PLAN을 조정한다.

3번과 같은 방법을 사용해도 되고 뷰를 이용해도 된다.
REMOTE 사이트의 테이블 여러개RK 조인될 경우 해당 SQL을 해당 리모트사이트에 뷰를 만들어 놓는다면, 한번의 Remote Operation만이 이루어질 것이다.
즉, Driving_site란 힌트가 제대로 수행이 되지 않는 경우 수행의 주체가되기를 원하는Remote DB상에 View를 생성하여
해당 View를 SELECT하므로써, PLAN을 조정할 수 있다.

 

출처 : ForYouWeb