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 튜닝 입문'
'프로그래밍' 카테고리의 다른 글
SQL튜닝 입문 - NESTED LOOPS/SORT/MERGE/HASH (0) | 2025.01.19 |
---|---|
SQL튜닝 입문 - INDEX, 결합INDEX (0) | 2025.01.12 |
SQL튜닝 입문 - 실행계획, 옵티마이저 (0) | 2025.01.12 |
스프링부트, REST, Token (0) | 2023.01.15 |
Spring MVC 공부(5) (0) | 2022.05.28 |