액세스 조건
필터조건
= 인덱스 수직적 탐색 비용 + 인덱스 수평적 탐색 비용 + 테이블 랜덤 액세스 비용
= 인덱스 루트와 브랜치 레벨에서 읽는 블록 수 +
인덱스 리프 블록을 스캔하는 과정에서 읽는 블록 수 +
테이블 액세스 과정에서 읽는 블록 수
⭐ OR-Expansion ( 출처 : 그루비 )
select * from emp
where job='CLERK' or deptno = 20
↓ ( job과 deptno 에 각각 생성된 인덱스를 사용하려면 )
select * from emp
where job='CLERK'
union all
select * from emp
where deptno = 20
and LNNVL(job='CLERK')
< 원본 >
select * from 거래
where **(:cust_id is null or 고객ID = :cust_id )**
and 거래일자 between :dt1 and :dt2
↓ ( union all 활용 )
select * from 거래
where **:cust_id is null**
and 거래일자 between :dt1 and :dt2
union all
select * from 거래
where **:cust_id is not null**
and **고객ID = :cust_id**
and 거래일자 between :dt1 and :dt2
select * from 거래
where **고객ID = nvl(:cust_id, 고객ID)**
and 거래일자 between :dt1 and :dt2
or
select * from 거래
where **고객ID = decode(:cust_id, null, 고객ID, :cust_id)**
and 거래일자 between :dt1 and :dt2
Full Scan 방식으로 읽으면서 encryption 함수가 테이블 건수만큼 수행
select /*+ full(a) */ 회원번호, 회원명, 생년, 생월일, 등록일자
from 회원 a
where 암호화된_전화번호 = encryption(:phone_no)
다른 조건절이 있는 경우 해당 조건절을 만족하는 건수만큼 encryption 함수 수행
select /*+ full(a) */ 회원번호, 회원명, 생년, 생월일, 등록일자
from 회원 a
where 생년 ='1987'
and 암호화된_전화번호 = encryption(:phone_no)
인덱스 3개 생성
create index 회원_x01 on 회원(생년);
create index 회원_x02 on 회원(생년, 생월일, 암호화된_전화번호);
create index 회원_x03 on 회원(생년, 암호화된_전화번호);
회원_x01 사용한 경우
→ 암호화된_전화번호 조건절을 액세스 단계에서 필터링 함
encryption 함수는 테이블 액세스 횟수( 생년 ='1987' 조건을 만족하는 건수 )만큼 수행한다.
회원_x02 사용한 경우
→ 암호화된_전화번호는 선행 컬럼인 생월일에 대한 '='조건이 없으므로 인덱스 필터 조건이다.
encryption 함수는 테이블 액세스 횟수( 생년 ='1987' 조건을 만족하는 건수 )만큼 수행한다.
회원_x03 사용한 경우
→ 암호화된_전화번호도 생년과 함께 인덱스 엑세스 조건으로 사용됨
encryption 함수는 단 한 번 수행된다.