SQLP

[SQLP] Hint

songsua 2024. 7. 26. 16:13

1. Hint 란 ★★★

옵티마이저가 항상 완벽한 실행 방안을 알려주는 것이 아니다.

따라서 사용자가 힌트 구문을 사용하여 사용자가 제시한 실행 방안으로 SQL 명령문을 실행할 수 있다.

- 힌트 구문으로 옵티마이저에게 명령할 수 있다.

- 힌트 구문으로 옵티마이저가 특정 계획으로 실행하도록 강제하는 것이 가능하다.

 

 

2. Hint 사용법

SELECT /*힌트명(p1 p2 p3 ...) */ 컬럼명 

1) 힌트는 select, update, delete 뒤에 사용한다.

2) 테이블 명, 별칭을 힌트 내의 변수 (p1 p2 p3 ...) 로 사용 가능하다. 다만 테이블 별칭(AS) 가 있으면 기존 테이블 명을 사용 불가하다.

주의: 힌트를 잘못 사용할 경우 oracle에서는 error 등의 알림 없이 무시를 해버린다. 따라서 정확하게 작성해야한다.

3. Hint의 사용이 무시되는 경우 ★★

1) 문법적으로 맞지 않는 힌트
2) 잘못된 참조의 사용 : 없는 테이블이나 없는 별칭(AS)를 사용

3)논리적으로 불가능한 액세스 경로를 유도 (비등가조건 사용인데 해시 조인)

4) 의미가 맞지 않는 힌트 기술

5) 옵티마이저에 의해서 내부적으로 쿼리가 변환된 경우 
예제)

#오류가 발생하는 명령문1
select /*+INDEX(EMP) FULL(DEPT)*/*    ##힌트는 별칭만 사용가능
FROM EMP.E,DEPT.D  ##EMP 테이블은 INDEX로 DEPT테이블은 FULL ACCESS로 방식으로 접근
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL>=3000;

##변경 
select /*+INDEX(E),FULL(D)*/*    
FROM EMP.E,DEPT.D  
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL>=3000;


#오류가 발생하는 명령문2
SELECT /*+FULL(SCOTT.EMP)*/EMPNO,ENAME  #테이블명 지정시 스키마명을 명시하면 안된다.
FROM EMP WHERE SAL>=3000;


#오류가 발생하는 명령문3
SELECT /*+FULL(EMP)*/EMPNO,ENAME  ##힌트는 별칭만 사용가능
FROM EMP E WHERE SAL>=3000;


#오류가 발생하는 명령문4
select /*+INDEX(E),FULL(D)*/*    ##여러 개 힌트 사용시 ',' 사용 금지
FROM EMP.E,DEPT.D  ##EMP 테이블은 INDEX로 DEPT테이블은 FULL ACCESS로 방식으로 접근
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL>=3000;