-- 1. 뷰를 액세스하는 쿼리
SELECT EDV.EMPNO
FROM EMP_DEPT_V EDV
WHERE EDV.DEPTNO = 20;
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;
SELECT E.EMPNO
, E.ENAME
, D.DEPTNO
, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
이렇게 EMP_DEPT_V가 있을 때 이 뷰를 액세스하는 쿼리가 있다고 가정해 보겠습니다.
이 때, 1번처럼 쿼리를 사용했는데 우리가 원하는 실행계획으로 풀리지 않을 때 뷰에 힌트를
주고 싶을 때가 있습니다.
이 때, 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;
FROM EMP_DEPT_V EDV
WHERE EDV.DEPTNO = 20;
이렇게 하면 힌트의 내용이 해당 뷰 안에까지 침투하여 원하는 실행계획을 유도할 수 있습니다.
이처럼 Alias.Alies... 로 접근을 하면 가장 큰 장점은 뷰를 사용할 때 해당 뷰를 수정하지 않고도 해당 화면에 최적화된 실행계획을 유도할 수 있다는 것입니다. 즉, 뷰를 여러곳에서 사용하지만 각각의 사용되는 곳에서 목적에 맞게 뷰를 컨트롤 할 수 있다는 뜻이죠.
인덱스의 경우는 해당 테이블을 참조하는 화면이 100개일 경우 이 100개에서 액세스되는 패턴을 모두 분석해서 최소공배수의 인덱스 전략을 세워야 하지만 힌트는 Objects로 생성하지 않고도 해당 어플리케이션에서 필요할 때마다 호출하여 사용할 수 있는게 가장 큰 매력입니다.
또 하나의 장점은 뷰의 Depth에 제한이 없다는 것입니다.
예를 들어, 뷰 -> 뷰 -> 뷰 -> 뷰 -> 뷰 처럼 5단계로 Depth가 있는 뷰일 경우 이 5단계 아래의 뷰를 호출하려면 계속 Alias.Alias... 처럼 접근하여 핸들링하면 컨트롤이 가능합니다.
댓글 없음:
댓글 쓰기