DBDBDEEP
3.3.3 액세스/필터 조건 본문
인덱스 액세스 조건
- 인덱스 액세스 조건은 인덱스 스캔 범위를 결정하는 조건절
- 수직적 탐색을 통해 스캔시작점의 리프블록을 결정하고 리프블록의 어느 특정 부분에서 스캔을 멈춰야 할지 결정하는 부분이다.
선행 컬럼이 모두 '=' 조건인 상태에서
첫 번째 나타나는 범위검색 조건까지만 만족하는 인덱스 레코드는 모두 연속해서 모여 있지만,
그 이하 조건까지 만족하는 레코드는 비교 연산자 종류에 상관없이 흩어지게 된다.

< 조건절 3 >
where C1 = 1
and C2 = 'A'
and C3 between ’ 가 ' and ' 다 ’
and C4 = 'a'
조건절 3처럼 3번째 선두 컬럼이 범위검색 조건이면 그 조건이 스캔 범위를 결정한다.
위의 1~3 번째 선두 컬럼 까지는 모두 액세스 조건이고 C4는 인덱스 필터 조건이 된다.
< 조건절 5 >
where C1 between 1 and 3
and C2 = 'A'
and C3 = ' 나'
and C4 = 'a'
조건절 5에서는 C1컬럼이 액세스 조건이고 나머지는 모두 필터조건이 된다.
그러나 C2~4도 어느정도 인덱스 스캔량을 줄이는 데 역할을 하지만 무시할만한 수준이다.

위와 같이 오라클에서 실행계획에 보여주게 되는데 포함되는 이유는 스캔량을 줄이는데 역할을 하기 때문
결론
- 실행계획에 위와 같이 표시되더라도 복잡하게 생각하지 말고
첫 번째 나타나는 범위 검색 조건까지가 인덱스 액세스 조건이고 나머지는 필터조건이라고 생각하자.
예시

* 조건 인덱스 선두 컬럼이 '=' 조건 (IN 조건도 일부 가능)이 되도록 하는게 좋음
* BETWEEN, <,>, LIKE 조건 이후의 컬럼은 FILTER 조건으로 됨 → CASE2 SAL 조건
* 인덱스 컬럼은 가공하지 않아야 함
- to_char(hiredate, 'yyyy/mm/dd') = '1981/01/01'

인덱스 필터 조건
- 인덱스 필터 조건은 테이블로 액세스 할지 말지를 결정하는 조건절
- 인덱스 / Full Scan 유무 관계 없이 테이블 액세스 단계에서 처리되는 조건절은 모두 필터조건

예시
* 해당 조건에 의하여 많은 결과가 걸러지는지 확인
- ACCESS 조건으로 변경 고민
* TABLE ACCESS 이후 FILTER 결과가 걸리지는지 확인
-INDEX SCAN 이후 FILTER 변경 고민
중요 포인트
- 조건절이 ACCESS 되는게 효율적.
'친절한 SQL 튜닝' 카테고리의 다른 글
| IN 조건이 '='으로 해석될 수 있는지 (0) | 2026.05.18 |
|---|---|
| 3.3.5 인덱스 선행 컬럼이 등치(=) 조건이 아닐 때 (0) | 2026.05.18 |
| 3.2.3 배치 I/O (0) | 2026.05.18 |
| 3.1.5 인덱스만 읽고 처리 (0) | 2026.05.16 |
| 3.1.2 Index Clustering Factor (0) | 2026.05.16 |