본문 바로가기

프로그래밍/oracle

oracle - [Hint]조인 방법 변경(DRIVING_SITE)

반응형

[Hint]조인 방법 변경(DRIVING_SITE)


분산환경(DB Link를 이용하는 경우)에서 쿼리를 사용하는 경우 일반적으로 SQL 실행의 주체는 해당 Query를 실행시킨 로컬데이터 베이스가 됩니다. 즉 원격지의 DEPT 테이블의 데이터를 로컬로 가져와서 조인을 하는 것은 로컬에서 하게 되구요… 참고로 이 힌트의 경우 Cost-Based Optimizer 또는 Rule-Based Optimizer환경 모두에서 사용 가능 합니다.


[형식]

/*+ DRIVING_SITE ( table ) */



SQL>select e.empno, e.ename, e.sal, d.dname, d.loc

      from emp e, dept@remote_db d   ? 요기 DB Link 사용했습니다.

      where e.deptno = d.deptno;


Execution plan

-------------------------------------------------------------------

SELECT STATEMENT Optimizer=CHOOSE

NESTED LOOPS

  REMOTE          remote_db

  TABLE ACCESS (BY INDEX ROWID) of ‘EMP’

    INDEX (RANGE SCAN) OF ‘idx_emp_deptno’ (NON-UNIQUE)

  

SERIAL_FROM_REMOTE SELECT “DEPTNO”, “DNAME”, “LOC” FROM “DEPT” “D……


DRIVING_SITE 힌트를 사용하면 인자로 취한 테이블이 위치한 원격지에서 조인이 일어나게 할 수 있는데 즉 아래의 실행 계획을 보면 위에서와는 달리 SELECT STATEMENT 부분에 REMOTE라는 것이 보일 겁니다. 즉 다음의 쿼리는 원격지에서 주도해서 그곳에서 조인이 일어났음을 알 수 있습니다.



SQL>select /*+ driving_site(d) */ e.empno, e.ename, e.sal, d.dname, d.loc

      From emp e, dept@remote_db d 

      Where e.deptno = d.deptno;


Execution plan

-------------------------------------------------------------------

SELECT STATEMENT(REMOTE) Optimizer=CHOOSE

MERGE JOIN

  SORT (JOIN)

      TABLE ACCESS (FULL) of ‘DEPT’

    SORT (JOIN)

      REMOTE*

  

SERIAL_FROM_REMOTE SELECT “EMPNO”, “ENAME”, “SAL” FROM ……


분산 환경의 쿼리를 실행하는 경우 그쪽의 DB사양이나 시스템 사양이 좋다면 DRIVING_SITE 힌트를 이용하여 그곳에서 드라이빙이 일어나게 할 수 있습니다.


[예]

SELECT /*+DRIVING_SITE(departments)*/ * 

FROM employees, departments@rsite 

WHERE employees.department_id = departments.department_id;

 

 

 

 


반응형