2014년 7월 10일 목요일

Optimizer Hint

  옵티마이저 힌트


가. 오라클 힌트
  1) 힌트 기술 방법
SELECT/*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk) USE_MERGE(j) FULL(j) */
e1.first_name, e1.last_name, j.job_id,
sum(e2.salary) total_sal
FROM employees e1, employees e2, job_history j
WHERE e1.employee_id = e2.manager_id
AND e1.employee_id = j.employee_id
AND e1.hire_date = j.start_date
GROUP BY e1.first_name, e1.last_name, j.job_id
ORDER BY total_sal;
 
 
2) 힌트가 무시되는 경우
A. 문법적으로 안맞게 기술
B. 의미적으로 안맞게 기술
C. 잘못된 참조 사용
D. 논리적으로 불가능한 액세스 경로
     조인절에 등치(=) 조건이 하나도 없는데 Hash join으로 유도하거나, Null 허용 커?에 대한 인덱스를 이용해 전체 건수 세려고 시도
E. 버그
    옵티마지어는 힌트를 선택가능한 옵션정도로 여기는 게 아니라, 사용자로부터 주어진 명령어로 인식
< 사용자 힌트에 대한 우선 반영 여부 테스트>
 
 
create table t1(a number, b varchar2(100));
create table t2(a number, b varchar2(100));
create table t3(a number, b varchar2(100));
create table t4(a number, b varchar2(100));
create table t5(a number, b varchar2(100));
 
alter system flush shared_pool;
 
declare
l_cnt number;
begin
for i in 1..100000
loop
execute immediate 'select /*+ ordered */ count(*) ' ||
' from t1, t2, t3, t4, t5 ' ||
' where t1.a =  ' || i ||
' and t2.a = ' || i ||
' and t3.a = ' || i ||
' and t4.a = ' || i ||
' and t5.a = ' || i into l_cnt;
end loop;
end;
/
 
PL/SQL procedure successfully completed.
 
Elapsed: 00:02:01.11
 
 
 
declare
l_cnt number;
begin
for i in 1..100000
loop
execute immediate 'select count(*) ' ||
' from t1, t2, t3, t4, t5 ' ||
' where t1.a =  ' || i ||
' and t2.a = ' || i ||
' and t3.a = ' || i ||
' and t4.a = ' || i ||
' and t5.a = ' || i into l_cnt;
end loop;
end;
/
 
 
PL/SQL procedure successfully completed.
 
Elapsed: 00:05:35.25
 
 
->> ordered 힌트를 명시하면 옵티마이저는 모든 조인 순서를 고려하지 않고,
사용자가 지정한 순서로만 실행계획 후보군을 선정하고 비용계산함.
 
 



3) 힌트 종류



## 옵티마이저 힌트에 관한 일반적인 사용 원칙
1. 가급적 힌트 사용을 자제하고, 옵티마이저가 스스로 좋은 선택을 할 수 있도록 돕는다.
2. 옵티마이저가 잘못된 선택을 할 때만 힌트를 사용한다.

댓글 없음:

댓글 쓰기