프로그래밍

SQL튜닝 입문 - INDEX 활용 불가능 케이스

RainIron 2025. 1. 12. 20:48
반응형

1. 인덱스 사용하면 안되는 경우

- 조건에 의한 처리 범위가 넓어짐으로써 분포도가 나빠지는 경우, 이 때 인덱스 스캔보다 FULL TABLE SCAN을 하는 것이 낫다 →FULL TABLE SCAN할 경우, 한 번의 I/O 때 마다 여러 개의 데이터 블록을 처리하기 때문에 I/O횟수가 감소함

2. 인덱스 사용 불가능한 경우

1) NOT 연산자 사용

SELECT *
FROM EMP
WHERE EMPNO != '1234'
;

SELECT *
FROM EMP
WHERE EMPNO <> '1234'
;

 

2) IS NULL, IS NOT NULL 사용

SELECT *
FROM EMP
WHERE EMPNO IS NULL;

 

3) 옵티마이저 취사 선택

옵티마이저의 자의적 판단에 의해서 인덱스를 사용할 수도 있고, 사용하지 않을 수 있는 경우

> 옵티마이저의 자의적 판단으로 잘못된 경로로 갈 수 있으므로 이를 제어하기 위해 HINT를 사용한다.

 

4) External suppressing: 인덱스에 활용하는 칼럼에 변형을 가할 경우

    (1) 불필요한 함수 사용하는 경우

WHERE SUBSTR(NAME, 1, 1) = 'K%';

-- 대체
WHERE NAME LIKE 'K%';

   

    (2) 문자열 결합

WHERE EMPNO||NAME = '1234KIM';

-- 대체
WHERE EMPNO = '1234' AND NAME = 'KIM';

 

    (3) DATE 변수의 가공

WHERE TO_CHAR(CREATE_DATE, 'YYYYMMDD') = '20241201';

-- 대체
WHERE CREATE_DATE BETWEEN TO_DATE('20241201', 'YYYYMMDD') AND TO_DATE('20241201', 'YYYYMMDD');

 

    (4) 산술식의 적용

WHERE SALARY * 12 > 50000000;

--대체
WHERE SALARY > 50000000/12 ;

 

5) Internal suppressing

- varchar2 or char to NUMBER

ex) salary + '10000000'

ex) bonus > salary / '10'

ex) MOD(salary, '100);

 

- varchar2 or char to DATE

3. 옵티마이저에 의한 선택 절차

- 특정 테이블에 대해서 SQL의 주어진 조건으로 인해 사용될 수 있는 인덱스가 두 개 이상일 경우

1. 주어진 조건에 대한 각 인덱스 별로 매칭률을 계산해서 매칭률이 높은 것을 우선적으로 선택

2. 인덱스 별 매칭률이 같을 경우에는 인덱스를 구성하는 칼럼의 개수가 많은 것을 우선적으로 선택

3. 인덱스 별 매칭률과 인덱스를 구성하는 칼럼의 개수가 같을 경우에는 가장 최근에 생성된 것을 우선적으로 선택

 

4. 추가

- 함수 사용과 GROUP BY가 동시에 있을 경우, GROUP BY로 행을 먼저 줄이는 것이 유효하다.

 

 

출처: 멀티캠퍼스 '업무에 바로 쓰는 SQL 튜닝 입문'

반응형