===== 3.2.1. 스캔(Scan)의 기본유형 =====
* __**스캔 : 스캔은 데이터를 최종적으로 액세스하는 방법을 말하는 가장 기본적인 실행계획**__
{{:study:oracle:datadb:3week_1:01실행계획.jpg|}}
{{:study:oracle:datadb:3week_1:02실행계획.jpg|}}
{{:study:oracle:datadb:3week_1:03실행계획.jpg|}}
==== 3.2.1.1. 전체테이블 스캔 ====
* 3.2.1.1. 전체테이블 스캔
- HIGH WATER MARK내에 있는 모든 블록을 스캔
* HIGH WATER MARK : 사용된 저장공간의 총합계 또는 데이터를 INSERT하기 위한 포맷된 영역 표시
- 대용량 일수록 전략적으로 사용하면 인덱스 스캔에 비하여 좋은 효율을 나타낼 수 있음(손익 분기점)
- 멀티 블록 I/O
- DB_FILE_MULTIBLOCK_READ_COUNT 파라미터 사용
- 옵티마이져의 전체 테이블 스캔 선택 사유
- 적용가능 인덱스의 부재
- 넒은 범위의 데이터 액세스
- 소량의 테이블 액세스
- 병렬처리 액세스
==== 3.2.1.2. ROWID 스캔 ====
* 3.2.1.2. ROWID 스캔
==== 3.2.1.3. 인덱스 스캔 ====
* 3.2.1.3. 인덱스 스캔
* 가)인덱스 유일 스캔(Index Unique Scan)
- 대부분 단 하나의 ROW를 추출
- 전제조건을 만족할 경우 옵티마이져는 인덱스 유일 스캔을 선택
- 인덱스가 기본키 이거나, 유일 인덱스(UNIQUE INDEX)로 구성
- 인덱스를 구성하는 모든 컬럼들이 모두 조건절에서 ‘=‘(EQUAL)비교
- 데이터베이스 링크(DATABASE LINK) 사용 시 힌트로 적용
- 힌트는 INDEX(TABLE_ALIAS INDEX_NAME) 힌트 적용
ex)
SELECT * FROM TAB1
WHERE COL1 = ‘A’
* 나)인덱스 범위 스캔(Index Range Scan)
- 추출되는 ROW는 INDEX 구성 컬럼의 정렬 순서와 동일
- ORDER BY 절이 있더라도 추가 정렬 작업이 필요 없을 수도 있음
- NON UNIQUE INDEX, UNIQUE INDEX
- 하나이상의 인덱스 선행컬럼에 상수나 변수로 조건이 부여되어야함
- 비교연산자는 ‘=, <, <=, >, >=, BETWEEN, LIKE’등
- 단, LIKE 연산자 사용시 ‘%ABC’의 경우 범위 스캔 불가
- COL1 + COL2 + COL3 에서 COL2 조건이 없는 경우
ex)
SELECT * FROM TAB1
WHERE COL2 BETWEEN 100 AND 110
* 다)인덱스 역순 범위 스캔(Index Range Scan Descending)
- 인덱스를 역순으로 스캔
- 기타 사항에 대하여는 인덱스 범위 스캔과 동일
- 가장 최근에 발생한 내용을 처리하기 위한 경우 사용
- 부분범위 처리(Partial Range)를 위해 사용
- ORDER BY …… DESC시 발생
- INDEX_DESC(TABLE_ALIAS INDEX_NAME) 힌트 사용시 발생
ex)
SELECT COL2 FROM TAB1
WHERE COL2 BETWEEN 100 AND 110
ORDER BY COL1 DESC
* 라)인덱스 스킵 스캔(Index Skip Scan)
- ORACLE 9i부터 적용
- Cardinality가 낮은 선행 컬럼 + 높은 후행칼럼으로 구성된 인덱스일수록 큰 효과
- 내부적으로 선행 컬럼 값의 Distinct Value 만큼의 Logical Sub-Index로 나눠서 SCAN한다.
- Analyze 되어있는 오브젝트에 적용된다.
{{:study:oracle:datadb:3week_1:04실행계획.jpg|}}
* 마)인덱스 전체 스캔(Index Full Scan)
- 전제조건(일괄 적용될 필요는 없음)
- 조건절에서 인덱스의 컬럼이 적어도 하나이상 사용되었을때
- 반듯이 선행컬럼이 사용될 필요는 없음
- 쿼리 내 사용된 어떤 테이블들의 모든 컬럼들이 인덱스에 존재
- 인덱스 컬럼중 최소한 NOT NULL인 컬럼이 최소 하나는 존재
- ORDER BY절이 사용될 경우 인덱스를 사용하여 SORT가 가능할때
- 반듯이 선행컬럼이 사용될 필요는 없음
- SINGLE BLOCK I/O 수행
* 바)인덱스 고속 전체 스캔(Index Fast Full Scans)
- 인덱스 스캔만을 하며, 테이블 액세스는 하지 않음
- MULTI BLOCK I/O를 수행
- BITMAP INDEX에서는 적용 불가
- 반듯이 선행컬럼이 사용될 필요는 없음
==== 3.2.1.4. B-Tree 클러스터 액세스(Cluster access) ====
* 3.2.1.4. B-Tree 클러스터 액세스(Cluster access)
- 클러스터링 테이블의 형태
- 대량의 범위처리의 효율화를 위한 단일 테이블 클러스터링
- 조인의 효율을 높이기 위한 두개 이상의 테이블 클러스터링
==== 3.2.1.5. 해쉬 클러스터 액세스(Hash cluster access ====
* 3.2.1.5. 해쉬 클러스터 액세스(Hash cluster access)
* 클러스터 : 데이터의 클러스터링 팩터를 높여 물리적인 I/O의 효율을 향상하기 위한 방안
* 해쉬 클러스터 : 해쉬함수에 의해 만들어진 해쉬값을 이용하여 클러스터링
* 인덱스 스캔 VS 해쉬클러스터
- 인덱스 스캔 : 인덱스 I/O + 테이블 I/O
- 해쉬 클러스터 : 해쉬함수 생성 + 테이블 I/O
{{:study:oracle:datadb:3week_1:05실행계획.jpg|}}
* 사용범위
- 액세스 형태가 고정적
- =, IN으로 적용 가능한 테이블
- 해쉬키 컬럼이 수정이 많지 않은 경우
- 데이터 증가가 많지 않은 경우
* 주의사항
- 지속적인 데이터 INSERT 할 경우
- 해쉬 클러스터의 사이즈를 물리적 공간에 미리 확보함
- 총 해쉬 클러스터의 크기(초기치) = HASHKEYS * SIZE
- 해쉬값의 개수 지정
- 클러스터 생성시 HASHKEYS 값에 의해 결정
- OVERFLOW BLOCK 문제 발생 가능
- 비효율이 발생되는 연산자
- 비교연산자 : LIKE, <>, >, =>, <, <= 등
==== 3.2.1.6. 표본 테이블 액세스(Sample table scan) ====
* 3.2.1.6. 표본 테이블 액세스(Sample table scan)
* 사용자가 지정한 범위(비율)에 대하여 데이터 처리
- 주의 사항
- 일정 비율의 데이터가 리턴 안 될 수 있음
- 동일한 데이터가 리턴되지 않을 수 있음
- ORACLE 10G 이전
- 단일 테이블에서 적용
- 조인, 뷰 또는 원격 테이블 사용 불가
- 단, 조인은 인라인 뷰를 이용하여 적용가능
- CBO 모드에서만 사용가능
- 데이터 마이닝(DATA MINING)
- 적은 표본오차 범위 내에서 데이터를 선별
- 데이터 마이닝 프로세스 부하를 축소
- 데이터 정제(CLEANSING)를 위한 데이터 오류 패턴 분석
- 데이터 웨어하우스 구축 시 적용
- 테스트를 위한 표본 데이터 생성
- 실 환경의 축소판을 생성하여 테스트 환경 구축