Oracle Predicate


Oracle Predicate 


오라클 Predicate에는 3가지 종류가 있음

1. Access predicate ("access")

- 인덱스의 leaf노드를 검사하는 경우를 지칭한다.

2. Index filter predicate ("filter" 이며 인덱스에서 이루어짐)

- 인덱스의 leaf노드를 검사하며, 인덱스의 검색 시작에서 끝이 지정되지 않는 경우 발생한다. 즉 인덱스를 다 검사하고 해당 내역이 아닌경우 필터 처리를 한다.
- 안전성 면에서 좋지 않음.
- 인덱스가 사용된다고 하더라도 테이블의 데이터 볼륨이 증가되거나, 시스템 로드가 빠른 속도로 증가되는 경우 급격히 성능 저하가 발생 될 수 있다.

3. Table level filter predicate("filter"이며 테이블 엑세스 처리)

- 필터 처리 대상이 인덱스에 존재하지 않고 테이블에 존재할 경우 발생한다.
- filter predicate가 발생하더라도 access predicate와 함께 발생하는 경우에는 성능에 대한 이슈가 크지 않다.

예제)

------------------------------------------------------
| Id | Operation         | Name       | Rows  | Cost |
------------------------------------------------------
|  0 | SELECT STATEMENT  |            |     1 | 1445 |
|  1 |  SORT AGGREGATE   |            |     1 |      |
|* 2 |   INDEX RANGE SCAN| SCALE_SLOW |  4485 | 1445 |
------------------------------------------------------

Predicate Information (identified by operation id):
   2 - access("SECTION"=:A AND "ID2"=:B)
       filter("ID2"=:B)

상기 예제는 2번 항목에 대해서 ID2와 SECTION이 인덱스로 검색 되어 access predicate가 걸렸음을 나타내고 있다.
그리고 ID2는 filter 처리 되었음을 보여주고 있다.

즉, SECTION = :A에 의해서 range 스캔을 수행하고, 각 row에 대해서 ID2 = :B로 필터링을 적용하였음을 보여준다.



Share this

Related Posts

Previous
Next Post »