2013년 8월 2일 금요일

[Oracle Hint]조인 방법 변경(DRIVING_SITE), 오라클 힌트

조인 방법 변경(DRIVING_SITE)

구로디지털 오엔제이프로그래밍실무교육센터
www.onjprogramming.co.kr


분산환경(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; 

댓글 없음:

댓글 쓰기