[강정식의 오라클 이야기] View 사용에서의 힌트사용 4 10 6,581

by 강정식 [강정식] [2007.08.14 03:07:58]


안녕하세요. 이번에도 튜닝 관련 좋은 내용을 공유하기 위해 글을 써보겠습니다.

-- 1. 뷰를 액세스하는 쿼리
SELECT EDV.EMPNO
FROM    EMP_DEPT_V EDV
WHERE  EDV.DEPTNO = 20;

-- 2. EMP_DEPT_V
SELECT E.EMPNO
           , E.ENAME
           , D.DEPTNO
           , D.DNAME
FROM    EMP E, DEPT D
WHERE  E.DEPTNO = D.DEPTNO;

이렇게 EMP_DEPT_V가 있을 때 이 뷰를 액세스하는 쿼리가 있다고 가정해 보겠습니다.
이 때, 1번처럼 쿼리를 사용했는데 우리가 원하는 실행계획으로 풀리지 않을 때 뷰에 힌트를
주고 싶을 때가 있습니다.

이럴 경우 대부분의 개발자들은 뷰 안에 원하는 힌트를 주어 컴파일 한뒤 사용을 하고 있습니다. 하지만 이렇게 뷰에 힌트를 넣어 변경할 경우 이 뷰를 사용하는 프로그램이 1번쿼리가 사용되는 프로그램에서만 사용되면 문제가 없겠지만 이 뷰를 참조하는 프로그램이 100개라고 한다면 나머지 99개는 비효율적인 실행계획을 생성할 확률이 높아집니다.

그렇지만 1번쿼리가 사용되는 곳에서는 반드시 이 힌트를 사용해야 하는 경우가 발생할경우, 이를 해결하기 위해 어떻게 해야할까요?

바로 Select-List에서 Alias.Column처럼 접근하듯이 힌트도 이렇게 접근할 수가 있습니다.

예를들어 /*+ LEADING(D) */ 힌트를 주어 DEPT 테이블부터 드라이빙이 되도록 하려고 합니다.

이를 뷰 안에 하지 않고 뷰를 사용하는 쿼리에다가 주고자 할 때는 다음과 같이 사용하시면 됩니다.

SELECT /*+ LEADING(EDV.D) */
             EDV.EMPNO
FROM    EMP_DEPT_V EDV
WHERE  EDV.DEPTNO = 20;

이렇게 하면 힌트의 내용이 해당 뷰 안에까지 침투하여 원하는 실행계획을 유도할 수 있습니다.

이처럼 Alias.Alies... 로 접근을 하면 가장 큰 장점은 뷰를 사용할 때 해당 뷰를 수정하지 않고도 해당 화면에 최적화된 실행계획을 유도할 수 있다는 것입니다. 즉, 뷰를 여러곳에서 사용하지만 각각의 사용되는 곳에서 목적에 맞게 뷰를 컨트롤 할 수 있다는 뜻이죠.

인덱스의 경우는 해당 테이블을 참조하는 화면이 100개일 경우 이 100개에서 액세스되는 패턴을 모두 분석해서 최소공배수의 인덱스 전략을 세워야 하지만 힌트는 Objects로 생성하지 않고도 해당 어플리케이션에서 필요할 때마다 호출하여 사용할 수 있는게 가장 큰 매력입니다.

또 하나의 장점은 뷰의 Depth에 제한이 없다는 것입니다.

예를 들어, 뷰 -> 뷰 -> 뷰 -> 뷰 -> 뷰 처럼 5단계로 Depth가 있는 뷰일 경우 이 5단계 아래의 뷰를 호출하려면 계속 Alias.Alias... 처럼 접근하여 핸들링하면 컨트롤이 가능합니다.

제 경우는 튜닝할 때 이처럼 힌트를 Depth로 계속 내려가는 것을 알지 못해서 고생했었는데 지금은 해당 화면에서 최적화된 힌트를 주어 실행계획을 유도할 수 있어서 무척 유용하게 사용하고 있습니다. 혹시 저처럼 아직 이 내용을 모르셔서 고생하시는 개발자 분들에게 도움이 되었으면 좋겠습니다.

감사합니다.

by 현 [2007.08.14 08:56:34]
q&a 게시판에 보면 간혹 뷰에 힌트를 주고 싶다는 분들 많으신데, 아주 유용한 자료가 되겠군요...좋은 정보 감사합니다...

by 김종만 [2007.08.14 13:00:08]
오, 정식!

by 마농 [2007.08.14 15:26:37]
몰랐던 내용이군요 ^^ 감사~ 추천 꾹.

by 챙 [2007.08.14 18:13:21]
오...날이갈수록 좋은 정보를 주십니다요 ^^

by 장태길 [2007.08.16 13:13:24]
좋은 내용이네요.. 메타링크에서 뷰내에서 힌트 사용을 비추하는 글을 본 기억이 나네요..

by 둘기 [2007.08.30 09:41:19]
좋은 정보 감사드립니다.

by 정 [2008.02.05 16:43:12]
view 힌트 감사합니다

by 멘토링 [2008.12.26 18:15:07]
좋은 정보 감사요^^

by 발로차는새 [2009.01.16 10:44:06]
이럴수가.... 너무 도움이 되는 내용입니다.. 감사합니다.

by 돛새치 [2009.05.07 13:45:41]
오 단계별 뷰에서의 알리아스...

ㄳㄳ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입