로컬 테이블과 리모트 테이블과의 조인 시 어느 서버에서 수행되는지 어떤 방식으로
조인이 풀리는지에 따라 성능에 큰 차이가 발생할 수 있습니다.
여기서는 driving_site 힌트를 사용하여 조인을 수행하는 서버를 제어하는
방법 정리하였습니다.
로컬에서 수행되는 조인
-- 로컬에서 조인 수행
explain plan FOR
SELECT count(*)
FROM sk.tab10 a, sk.tab1@LN_ORA11G b
WHERE a.object_name = b.object_name
;
select * from table(dbms_xplan.display(format=>'advanced'));
------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Inst |IN-OUT|
------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 229 | | 1255 (1)| 00:00:01 | | |
| 1 | SORT AGGREGATE | | 1 | 229 | | | | | |
|* 2 | HASH JOIN | | 102K| 22M| 3352K| 1255 (1)| 00:00:01 | | |
| 3 | INDEX FAST FULL SCAN| TAB10_IX1 | 72914 | 2492K| | 140 (0)| 00:00:01 | | |
| 4 | REMOTE | TAB1 | 85846 | 15M| | 114 (0)| 00:00:01 | LN_OR~ | R->S |
------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"."OBJECT_NAME"="B"."OBJECT_NAME")
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (#keys=0) COUNT(*)[22]
2 - (#keys=1)
3 - "A"."OBJECT_NAME"[VARCHAR2,128]
4 - "B"."OBJECT_NAME"[VARCHAR2,384]
Remote SQL Information (identified by operation id):
----------------------------------------------------
4 - SELECT "OBJECT_NAME" FROM "SK"."TAB1" "B" (accessing 'LN_ORA11G' )
리모트에서 조인 수행
driving_site(b) 힌트를 사용하여 LN_ORA11G 링크에서 조인을 수행하도록 제어-- driving_site 힌트 사용(리모트에서 조인 수행)
explain plan FOR
SELECT /*+ driving_site(b) */count(*)
FROM sk.tab10 a, sk.tab1@LN_ORA11G b
WHERE a.object_name = b.object_name
;
select * from table(dbms_xplan.display(format=>'advanced'));
------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Inst |IN-OUT|
------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT REMOTE| | 1 | 196 | | 1008 (1)| 00:00:13 | | |
| 1 | SORT AGGREGATE | | 1 | 196 | | | | | |
|* 2 | HASH JOIN | | 82871 | 15M| 5296K| 1008 (1)| 00:00:13 | | |
| 3 | INDEX FAST FULL SCAN| TAB1_IX01 | 69466 | 4477K| | 120 (0)| 00:00:02 | ORADB | |
| 4 | REMOTE | TAB10 | 72914 | 9256K| | 140 (0)| 00:00:02 | ! | R->S |
------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A2"."OBJECT_NAME"="A1"."OBJECT_NAME")
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - (#keys=0) COUNT(*)[22]
2 - (#keys=1)
3 - "A1"."OBJECT_NAME"[VARCHAR2,128]
4 - "A2"."OBJECT_NAME"[VARCHAR2,256]
Remote SQL Information (identified by operation id):
----------------------------------------------------
4 - SELECT "OBJECT_NAME" FROM "SK"."TAB10" "A2" (accessing '!' )
-- 리모트 DB에서 수행 SQL 조회 시 아래 형태로 SQL이 변환되어 보여짐
SELECT COUNT(*) FROM "SK"."TAB10"@! "A2","SK"."TAB1" "A1" WHERE "A2"."OBJECT_NAME"="A1"."OBJECT_NAME"
댓글
댓글 쓰기