728x90
# OPERATOR
- INLIST ITERATOR
l 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
l 최대월급을 출력하시오(인덱스를 이용해서)
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 |