본문 바로가기

빅데이터과정/SQL TUNING

#34_140730_TUNING_OPERATOR

728x90

# OPERATOR



  • INLIST ITERATOR



in 연산자를 사용했을 때의 SQL 성능을 높이는 방법

inlist를 이용해서 쿼리를 작성할 경우에 index scan이 나눠지지 않고 잘 수행되면 튜닝할 필요가 없다

그러나 아래의 그림처럼 index가 나눠지는 경우에는 concat 힌트를 이용해서 하나로 합쳐줄 필요가 있다
/*+ QB_NAME(main) use_concat(@main 8) */




문제40. 부서번호에 인덱스를 생성하고 부서번호가 10번 20번인 사원들의 이름과 월급과 직업과 부서번호를 출력하시오

CREATE INDEX emp_deptno ON EMP(deptno);

튜닝 전
현재 방식
SELECT ename, sal, job
FROM EMP
WHERE deptno IN (10,20);



현재는 대부분 위처럼 수행되지만 과거에는 아래의 그림처럼 나눠서 수행되기도 했기 때문에 튜닝이 필요하다
때에따라서는 특정 쿼리가 아래처럼 수행될 경우에 튜닝이 필요하다

과거 방식
SELECT /*+ rule */ ename, sal, job
FROM EMP
WHERE deptno IN (10,20);
/*+ rule */  :  옵티아미저에게 원칙대로 하도록 한다
인덱스가 있으면 무조건 인덱스 액세스



결국 위의 쿼리는 아래와 같다고 보면 된다
select ename, sal, deptno, job
from emp
where deptno = 10
union all
select ename, sal, deptno, job
from emp
where deptno = 20;

튜닝 후
SELECT /*+ QB_NAME(main) use_concat(@main 8) */ ename, sal, job, deptno
FROM EMP
WHERE deptno IN (10,20);
QB_NAME(main) : 쿼리의 이름을 main으로 하겠다
@main 8
1 : union all 로 분리
8 : in list로 수행





튜닝 전
SELECT /*+ rule */ COUNT(*)
FROM sales500
WHERE channel_id IN (3,4,5);



튜닝 후
SELECT /*+ QB_NAME(main) use_concat(@main 8) */ COUNT(*)
FROM sales500
WHERE channel_id IN (3,4,5);








  • VIEW OPERATOR





  • MIN/MAX AND FIRST ROW OPERATORS





최대월급을 출력하시오(인덱스를 이용해서)

SELECT /*+ index_desc(emp emp_sal) */ sal
FROM EMP
WHERE sal >= 0 AND ROWNUM = 1;



SELECT MAX(sal)
FROM EMP
WHERE sal >= 0;
count stopkey 와 frist row와 같다
count stopkey 는 읽다가 첫번째에 멈췄다
둘다 sort를 수행하지 않은 것을 확인할 수 있다




'빅데이터과정 > SQL TUNING' 카테고리의 다른 글

#35_140801_TUNING_JOIN TUNING2  (0) 2014.08.01
#34_140731_TUNING_JOIN TUNING  (0) 2014.07.31
#34_140730_TUNING_SORTING OPERATION  (0) 2014.07.30
#34_140730_TUNING_INVISIBLE INDEX  (0) 2014.07.30
#33_140729_TUNING_INDEX MONITORING  (0) 2014.07.29