Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

DBDBDEEP

3.3.3 액세스/필터 조건 본문

친절한 SQL 튜닝

3.3.3 액세스/필터 조건

Kihwane 2026. 5. 18. 10:51

인덱스 액세스 조건

- 인덱스 액세스 조건은 인덱스 스캔 범위 결정하는 조건절

- 수직적 탐색을 통해 스캔시작점의 리프블록을 결정하고 리프블록의 어느 특정 부분에서 스캔을 멈춰야 할지 결정하는 부분이다.

 

 

 

선행 컬럼이 모두 '=' 조건인 상태에서

번째 나타나는 범위검색 조건까지만 만족하는 인덱스 레코드는 모두 연속해서 모여 있지만,

이하 조건까지 만족하는 레코드는 비교 연산자 종류에 상관없이 흩어지게 된다.

 

< 조건절 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 되는게 효율적.