DB LINK를 이용한 분산 DB Query의 경우, 로컬 DB 와 다른 관점의 튜닝이 필요합니다.
1. 가급적 Nested Loop을 피하고, Hash Join 처리 하여, Network Round Trip 을 줄인다
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
상황에 따라 다르겠지만 일반적으로 네트웍을 통한 분산 SQL 튜닝에서,
로컬 DB에서만 수행되는 SQL과 튜닝포인트가 다른 점은…
분산 DB QUERY의 NETED LOOP 조인은 조인 건수만큼의 네트웍 RoundTrip이 발생하므로, 조인건수가 많을 경우
네트웍 Round Trip 에 소요되는 시간이 상당히 많다는 것입니다.
그러므로 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 힌트를 사용하도록 합니다.
예>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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으로 수정이 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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을 조정할 수 있습니다.
Hi there very nice site!! Man .. Beautiful .. Amazing .. I’ll bookmark your site and take the feeds alsoKI’m glad to find so many useful information right here within the publish, we’d like work out more strategies in this regard, thanks for sharing. . . . . .