반응형
- SCAN
DB에 적재된 데이터를 읽는 작업
- FULL TABLE SCAN: 테이블 전체 스캔
- 많은 데이터를 이용할 때 좋음. 테이블의 일정 비율 이상되는 데이터가 필요할 때.
- ROWID SCAN: Oracle 고유 컬럼인 ROW ID라는 행번호로 스캔
- Where 조건절에 ROWID를 입력하는 경우 이용.
- 추출할 데이터양을 제한할 때 사용 (MSSQL의 TOP N과 유사한 용도)
- INDEX SCAN: Index를 이용하여 데이터 스캔
- 적은 데이터를 추출할 때 좋음
- INDEX UNIQUE SCAN
- UNIQUE INDEX를 사용하는 경우.
- 조건절에 UNIQUE INDEX 컬럼 = 로 명시
- 조건에 부합하는 데이터를 찾을 경우 탐색을 종료함
- INDEX RANGE SCAN (DESCENDING)
- 가장 흔하게 사용되는 방식
- INDEX 내의 조건절에 명시된 범위의 데이터에 오름차순으로 접근 (ORDER BY DESC를 한 경우 내림차순)
- 조건절이 INDEX 선행컬럼이 있는 경우. 조건값에 와일드 카드를 이용하는 경우 ( LIKE 'AA__%')
- INDEX SKIP SCAN (DESCENDING)
- 결합 인덱스의 후행컬럼은 있으나 선행컬럼(첫번째컬럼)이 조건절에 없는 경우 (ORDER BY DESC를 한 경우 내림차순)
- 선행컬럼이 범위 검색 조건일 경우(LIKE, BETWEEN, 부등호)
- 옵티마이저가 INDEX 내에서 조회하는 것이 TABLE FULL SCAN보다 빠르다고 판단한 경우
- INDEX COLUM: A B C
WHERE B = 'AAA'
와 같이 작성된 경우 WHERE절에 A(선행컬럼)가 없는 경우. - 힌트: INDEX_SS (반대 NO_INDEX_SS)
- INDEX FULL SCAN
- 인덱스 블록 전체를 순차적으로 접근하는 방식
- INDEX RANGE SCAN과 동일한 매커니즘으로 동작
- 최적의 인덱스가 없는 경우, FULL TABLE SCAN보다 효율적일 경우
- ORDER BY INDEX 컬럼 혹은 MIN, MAX값을 구하는 경우 용이
NOT NULL 조건과 함께 ORDER BY 사용해야 INDEX FULL을 이용할 수 있음, 결과집함이 많을 경우 FULL TABLE SCAN이 나음 - SELECT /*+ INDEX(T) */ C FROM T WHERE C IS NOT NULL
인덱스 이용, INDEX 컬럼에 NULL이 아닌 전체이므로 INDEX 전체가 되는 것
(NULL이 있으면 INDEX를 사용할 수 없음)
- INDEX FAST FULL SCAN
- 인덱스 블록 전체를 병렬 처리로 접근하는 방식
- INDEX FULL SCAN과 달리 순차적이지 않으므로 정렬을 지원하지 않음
- 병렬처리를 지원하여 속도가 빠름
- 단, 힌트를 명시해야만 이용 가능
- 힌트: INDEX_FFS (반대 NO_INDEX_FFS)
- INDEX 힌트 사용법
/*+ INDEX_FFS(테이블명) */: SELECT /*+ INDEX_FFS(T) */ C FROM T
/*+ INDEX_FFS(테이블명 인덱스명) */: SELECT /*+ INDEX_FFS(T IDX) */ C FROM T
/*+ INDEX_FFS(테이블명 테이블(컬럼명)) */: SELECT /*+ INDEX_FFS(T T(C)) */ C FROM T
인덱스에 관련된 다양한 자료를 조사하여 정리
INDEX 전체
INDEX FULL SCAN
INDEX FAST FULL SCAN
반응형
'DB > Oracle DB' 카테고리의 다른 글
tnsnames.ora 위치 (0) | 2022.11.04 |
---|---|
ORACLE 프로시저 호출 변수 선언 (0) | 2022.06.08 |
Oracle 설치 없이 Toad 사용하기 (0) | 2021.09.01 |
ORACLE SQL 팁 - 특정 컬럼 SELECT (0) | 2020.07.05 |
Oracle SQL 실행계획 (0) | 2018.12.01 |