- 기본적으로는 인덱스 칼럼 추가로 튜닝을 하는데, (랜덤 IO 줄이는 효과인가? ) 인덱스 스캔 효율화는 다양한 방법이 존재한다.
3.3.1. 인덱스 탐색
- 인덱스 탐색 과정 상세
- 인덱스를 구성하는 두 개 칼럼에 대해, 둘다 between 조건 절로 묶여있다면 선두 칼럼은 인덱스의 스캔 범위를 줄이는데 도움이 되지만, 두번째 칼럼은 그렇지 못하다.
3.3.2. 인덱스 스캔 효율성
결국 인덱스 선행 컬럼이 조건절에 없거나, '=' 연산이 아니라면 비효율이 발생한다.
- C1, C2, C3, C4 -> C3 에 대한 조건 없이 C4 에 대한 '=' 조건만 있는 경우, 비효율 발생.
- '=' 가 아니라 between 조건이라면 비효율 발생.
선두 칼럼
- 가장 앞에 있는 칼럼.
선행 칼럼
- 특정칼럼보다 상대적으로 앞쪽에 있는 칼럼
3.3.3. 엑세스 조건과 필터 조건
- 인덱스 스캔 단계에 처리하는 조건절
- 엑세스 조건
- 인덱스 스캔 범위를 정하는 조건절. (인덱스 수직적 탐색을 통해 스캔 시작점 / 리프 블록 탐색을 수행하다가 멈출 위치에 영향. )
- 필터 조건
- 인덱스 필터
- 테이블로 엑세스 할지를 결정하는 조건절.
- 인덱스로 접근하든, 테이블 full scan 을 하든 테이블에 엑세스하는 것은 필터조건이다.
- 테이블 필터
- 엑세스 단계에서 처리되는 조건절 모두.
- 다음으로 갈지, 최종 결과에 넣을지
- 인덱스 필터
- 엑세스 조건
3.3.4. 비교 연산자 종류와 칼럼 순서에 따른 군집성
3.3.5. 인덱스 선행 칼럼이 등치 조건이 아닐 때 생기는 비효율
3.3.6. BETWEEN 을 IN-LIST 로 전환
- In-LIST 항목 개수가 늘어날 경우
- NL 방식의 조인 or 서브쿼리
- 주의사항
- 리프 블록의 탐색보다 수직적 탐색이 더 많아지는 경우를 주의.
- -> 레코드들이 서로 멀리 떨어져있을 때 효과적.
3.3.7. Index Skip Scan ⭐️
- BETWEEN 일 때도 유용.
- 3.3.8. IN 조건이 '=' 인가. ⭐️*
- 필터조건임.
- '=' 가 되기 위해서는 IN-List Iterator 방식으로 수행해야 함.
- in-list 를 엑세스 조건 / 필터 조건으로 유도하는 방법
- 3.3.9. BETWEEN 과 LIKE 스캔 범위 비교*
- 범위조건 검색이라서, 범위 검색 시의 비효율 원리가 같다.
- between vs like
- like 가 포함하는 범위가 더 넓은 경우가 많음. (2019%인지 201904부터인지. )
- 3.3.10. 범위 조건 검색을 남용 시 생기는 비효율*
- 3.3.11. 다양한 옵션 조건 처리 방식의 장단점 비교*
OR
- LIKE/BETWEEN
- like 주의사항
- like 는 숫자형도 문자형으로 변환되기 때문에 주의
- 가변 길이 칼럼
- 사용하려면
- like 주의사항
- UNION ALL
- 인덱스를 가장 쉽게 사용할 수 있는 방식.
NVL/DECODE 함수 활용
- 3.3.12. 함수 호출 부하 해소를 위한 인덱스 구성*
- PL/SQL 사용자 함수의 성능적 특성
- 매우 느림.
- 가상머신 상에서 실행되는 인터프리터 언어라서.
- 컨텍스트 스위칭
- recursive call
- 사용할 수 밖에 없다면 함수 호출 줄이기 :
- 인덱스 칼럼 단에서 최소한으로 만들기
'개발 > TIL' 카테고리의 다른 글
[sql 튜닝] Chapter 4.3 해시 조인 4.4 서브쿼리 조인 (0) | 2025.05.08 |
---|---|
[sql 튜닝 ]chapter 4.1 NL 조인, 4.2 소트 머지 조인 (0) | 2025.05.07 |
[sql 튜닝] 인덱스 튜닝 3-2. 부분범위 처리 (0) | 2025.04.17 |
[SQL] 데이터의 저장, 논리적 I/O (0) | 2025.03.10 |
[SQL] 인덱스 기본 구조 (0) | 2025.03.09 |