오라클힌트강좌 #20
Query Transformation
Predicate Pushing, Join Predicate Pushdown(JPPD)
(PUSH_PRED, NO_PUSH_PRED
NO_QUERY_TRANSFORMATION 힌트)
이종철, 탑크리에듀(www.topcredu.co.kr)
실습코드 및 다시보기는 다음 URL에서 가능합니다.
http://ojc.asia
Join Predicate Pushdown(JPPD)
• Join Predicate Pushdown은 뷰가 인덱스 기반의 중첩루프 조인에서 사용되어 다른 테이블이나
쿼리블럭과 조인되는 경우 조인조건을 뷰안으로 밀어 넣는 것을 이야기 한다. 조인을 수행중 드
라이빙 테이블에서 읽은 값을 뷰안에 조건으로 밀어 넣는 것으로 조인 조건 컬럼을 뷰안으로 병
합하는 것이다.
• Join Predicate Pushdown은 대체로 성능을 개선시키지만 일부 복잡한 쿼리문에서는 그렇지 못하
는 경우가 있어 힌트 또는 오라클 내부 히든 파라미터인 “_push_join_predicate” 값을 제어함으
로서 조절이 가능하다.
• alter session set "_PUSH_JOIN_PREDICATE“ = FALSE;
• push_pred, no_push_pred 힌트로 join predicate pushdown 사용여부를 제어
• Join Predicate Pushdown은 뷰 외부의 조인조건에 의해 많은 데이터가 추출되는 경우 좋지않은
성능을 유발시키므로 해시조인, 소트-머지조인이 효울적일 수도 있다.
• UNION ALL/UNION뷰, Outer-joined뷰, Anti-joined뷰, Semi-joined뷰, DISTINCT뷰, GROUP-BY뷰
등에서 사용가능 하다.
Join Predicate Pushdown – Example
-- 실습환경 오라클 11g R2, 옵티마이저 모드는 ALL_ROWS(CBO)
-- myemp1은 1000만건, deptno 칼럼, mgr 칼럼은 각각 인덱스 생성되어 있음
-- 테스트 뷰생성
create or replace view v_mgr
AS SELECT empno, ename, mgr
FROM myemp1 where deptno = '1';
-- 힌트없이 실행
SELECT emp.ename "사원",
v_mgr.ename "관리자"
FROM myemp1 emp , v_mgr
WHERE emp.mgr = v_mgr.empno(+)
AND emp.ename like '%홍길동57%';
PUSH_PRED – Example
-- PUSH_PRED : 조인조건을 뷰안으로 밀어 넣으라는 힌트
-- NO_MERGE와 같이 사용해야 작동한다.
-- 0초
SELECT /*+ NO_MERGE(v_mgr)
PUSH_PRED(v_mgr)*/
emp.ename "사원",
v_mgr.ename "관리자"
FROM myemp1 emp ,
v_mgr
WHERE emp.mgr = v_mgr.empno(+)
AND emp.ename like '%홍길동57%';
NO_PUSH_PRED– Example
-- NO_PUSH_PRED : 조인조건을 뷰안으로 밀어 넣지말라는 힌트
-- 1분30초
SELECT /*+ NO_MERGE(v_mgr)
NO_PUSH_PRED(v_mgr)*/
emp.ename "사원",
v_mgr.ename "관리자"
FROM myemp1 emp ,
v_mgr
WHERE emp.mgr = v_mgr.empno(+)
AND emp.ename like '%홍길동57%';
NO_QUERY_TRANSFORMATION– Example
-- View Merging, Subquery Unnesting, Predicate Pushing
-- Star transformation,Materialized view rewrite등을 하지말라는 힌트
-- 7초
SELECT /*+ NO_QUERY_TRANSFORMATION */
emp.ename "사원",
v_mgr.ename "관리자"
FROM myemp1 emp ,
v_mgr
WHERE emp.mgr = v_mgr.empno(+)
AND emp.ename like '%홍길동57%';
This practice makes Expert!
PL/SQL단기속성(1일완성)SQL힌트/튜닝(단기2일교육)SQL기초과정

[SQL튜닝강좌추천]오라클 Query Transformation,뷰조인조건푸시,Join predicate pushdown, Push_PRED, NO_PUSH_PRED NO_QUERY_TRANSFORMATION 오라클힌트_오라클/SQL튜닝실무강좌

  • 1.
    오라클힌트강좌 #20 Query Transformation PredicatePushing, Join Predicate Pushdown(JPPD) (PUSH_PRED, NO_PUSH_PRED NO_QUERY_TRANSFORMATION 힌트) 이종철, 탑크리에듀(www.topcredu.co.kr)
  • 2.
    실습코드 및 다시보기는다음 URL에서 가능합니다. http://ojc.asia
  • 3.
    Join Predicate Pushdown(JPPD) •Join Predicate Pushdown은 뷰가 인덱스 기반의 중첩루프 조인에서 사용되어 다른 테이블이나 쿼리블럭과 조인되는 경우 조인조건을 뷰안으로 밀어 넣는 것을 이야기 한다. 조인을 수행중 드 라이빙 테이블에서 읽은 값을 뷰안에 조건으로 밀어 넣는 것으로 조인 조건 컬럼을 뷰안으로 병 합하는 것이다. • Join Predicate Pushdown은 대체로 성능을 개선시키지만 일부 복잡한 쿼리문에서는 그렇지 못하 는 경우가 있어 힌트 또는 오라클 내부 히든 파라미터인 “_push_join_predicate” 값을 제어함으 로서 조절이 가능하다. • alter session set "_PUSH_JOIN_PREDICATE“ = FALSE; • push_pred, no_push_pred 힌트로 join predicate pushdown 사용여부를 제어 • Join Predicate Pushdown은 뷰 외부의 조인조건에 의해 많은 데이터가 추출되는 경우 좋지않은 성능을 유발시키므로 해시조인, 소트-머지조인이 효울적일 수도 있다. • UNION ALL/UNION뷰, Outer-joined뷰, Anti-joined뷰, Semi-joined뷰, DISTINCT뷰, GROUP-BY뷰 등에서 사용가능 하다.
  • 4.
    Join Predicate Pushdown– Example -- 실습환경 오라클 11g R2, 옵티마이저 모드는 ALL_ROWS(CBO) -- myemp1은 1000만건, deptno 칼럼, mgr 칼럼은 각각 인덱스 생성되어 있음 -- 테스트 뷰생성 create or replace view v_mgr AS SELECT empno, ename, mgr FROM myemp1 where deptno = '1'; -- 힌트없이 실행 SELECT emp.ename "사원", v_mgr.ename "관리자" FROM myemp1 emp , v_mgr WHERE emp.mgr = v_mgr.empno(+) AND emp.ename like '%홍길동57%';
  • 5.
    PUSH_PRED – Example --PUSH_PRED : 조인조건을 뷰안으로 밀어 넣으라는 힌트 -- NO_MERGE와 같이 사용해야 작동한다. -- 0초 SELECT /*+ NO_MERGE(v_mgr) PUSH_PRED(v_mgr)*/ emp.ename "사원", v_mgr.ename "관리자" FROM myemp1 emp , v_mgr WHERE emp.mgr = v_mgr.empno(+) AND emp.ename like '%홍길동57%';
  • 6.
    NO_PUSH_PRED– Example -- NO_PUSH_PRED: 조인조건을 뷰안으로 밀어 넣지말라는 힌트 -- 1분30초 SELECT /*+ NO_MERGE(v_mgr) NO_PUSH_PRED(v_mgr)*/ emp.ename "사원", v_mgr.ename "관리자" FROM myemp1 emp , v_mgr WHERE emp.mgr = v_mgr.empno(+) AND emp.ename like '%홍길동57%';
  • 7.
    NO_QUERY_TRANSFORMATION– Example -- ViewMerging, Subquery Unnesting, Predicate Pushing -- Star transformation,Materialized view rewrite등을 하지말라는 힌트 -- 7초 SELECT /*+ NO_QUERY_TRANSFORMATION */ emp.ename "사원", v_mgr.ename "관리자" FROM myemp1 emp , v_mgr WHERE emp.mgr = v_mgr.empno(+) AND emp.ename like '%홍길동57%';
  • 8.
    This practice makesExpert! PL/SQL단기속성(1일완성)SQL힌트/튜닝(단기2일교육)SQL기초과정