■ Full table scan
- 순차적 블록 액세스
- 멀티블록I/O 및 병렬화 가능
■ Index scan
- 인덱스 블록 액세스 후 ROWID를 통해 데이터 블록 획득
- 비순차적 블록 액세스
- 멀티블록I/O 사용 불가 (싱글블록I/O)
■ Fast full index scan
- 질의에 필요한 모든 컬럼이 인덱스에 포함된 경우
- 멀티블록I/O 및 병렬화 가능
◆ 결합 인덱스의 between과 in의 비교
- 구간검색 시 between보다 in이 속도가 훨씬 빠르다.
20100501 ~ 20100531 사이에 판매된 맛동산 정보 찾는 쿼리를 날린다고 가정하자.(맛동산 제품코드=100)
SQL> select *
from 판매
where p_code = 100
and p_date between '20100501' and '20100531';
위와 같은 쿼리를 예상하는데, 아래와 같이 해주면 쿼리가 훨씬 빠르다.
SQL> select *
from 판매
where p_code = 100
and p_date in ('20100501', '20100502', ..., '20100531');
그러나 만약 6개월치를 찾아야 한다면 어떻게 될까? 6개월 치 모두를 in 연산자 안에 써주어야 할까? 그래도 되지만 일일이 다 써주는 것보다는 서브쿼리를 이용해 아래처럼 해주면 될 것이다.
SQL> select *
from 판매
where p_code = 100
and p_date in (select sdate
from ttable // ttable은 날짜만 들어있는 테이블
where sdate between '20100501' and '20101231');
SQL> select *
from 판매
where p_code = 100
and p_date between '20100501' and '20100531';
위와 같은 쿼리를 예상하는데, 아래와 같이 해주면 쿼리가 훨씬 빠르다.
SQL> select *
from 판매
where p_code = 100
and p_date in ('20100501', '20100502', ..., '20100531');
그러나 만약 6개월치를 찾아야 한다면 어떻게 될까? 6개월 치 모두를 in 연산자 안에 써주어야 할까? 그래도 되지만 일일이 다 써주는 것보다는 서브쿼리를 이용해 아래처럼 해주면 될 것이다.
SQL> select *
from 판매
where p_code = 100
and p_date in (select sdate
from ttable // ttable은 날짜만 들어있는 테이블
where sdate between '20100501' and '20101231');
◆ Index full scan과 Index fast full scan의 비교
- Index full scan이라는 것이 실행계획에 나오면 굉장히 느린 것이다. 인덱스를 타긴 타는데 처음부터 끝까지 읽기 때문에 인데스를 사용하는 것에 비해 효율이 떨어진다.
○ Index full scan
- 인덱스를 처음부터 끝까지 순차적으로 읽어들임.
- 병렬처리를 하지 못함.
- 사용하지 않는 것이 좋다.
○ Index fast full scan
- 인덱스를 비순차적으로 처음부터 끝까지 읽어들임.
- 병렬처리 가능함.
- 인덱스로 구성된 컬럼만을 조회할 때 사용 가능.
- 멀티블록I/O 가능.
/*+ INDEX_FFS(테이블명 인덱스명) */
'오라클 > 튜닝' 카테고리의 다른 글
[튜닝] Index suppressing 현상 (0) | 2010.10.09 |
---|---|
[튜닝] 인덱스의 종류 (0) | 2010.10.09 |
[튜닝] 튜닝 관점에서의 인덱스 개념 (0) | 2010.10.09 |
[튜닝] CBO 통계의 수집 (0) | 2010.10.07 |
[튜닝] 옵티마이저 동작의 조정 (0) | 2010.10.07 |