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로 필터링을 적용하였음을 보여준다.