===== 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)를 위한 데이터 오류 패턴 분석 - 데이터 웨어하우스 구축 시 적용 - 테스트를 위한 표본 데이터 생성 - 실 환경의 축소판을 생성하여 테스트 환경 구축