[ORACLE] DB LINK 사용 시 테이블 조인 수행하는 서버 지정하기


    DB LINK를 사용하는 SQL에서 성능이 안 나오는 경우가 있습니다.
    로컬 테이블과 리모트 테이블과의 조인 시 어느 서버에서 수행되는지 어떤 방식으로 조인이 풀리는지에 따라 성능에 큰 차이가 발생할 수 있습니다.
    여기서는 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"   
    
    

    댓글