IOT
- 인덱스 리프 블록이 곧 데이터 블록
- 오라클 IOT는 PK 컬럼 순으로만 정려할 수 있다.
IOT 장단점
- IOT 장점
● 인위적으로 클러스터링 팩터를 좋게 만드는 방법 중 하나
● random 엑세스가 아닌 Sequential 방식으로 데이터를 엑세스
● 넓은 범위를 엑세스 할 때 유리
● PK 인덱스를 위한 별도의 세그먼트를 생성하지 않아도 됨
- IOT 단점
● 데이터 입력시 느리다. ( 그러나, PK 인덱스를 두고 비교해 보면 차이가 거의 없다.)
● 인덱스 분할 발생량 차이로 인한 성능차이가 크다.
● Direct Path Insert 가 작동하지 않음
IOT 사용 시기
- 크기가 작고 NL 조인으로 반복 룩업하는 테이블
(그러나, PK이외의 속성 크기 때문에 인덱스 높이가 증가한다면 역효과)
- 폭이 좁고 긴 테이블
(M:M 관계를 해소하기 위한 테이블)
- 넓은 범위를 주로 검색하는 테이블
● Between, Like 같은 조건으로 넓은 범위를 검색하는 테이블
( PK 이외 컬럼이 별로 없는 통계성 테이블에는 최적의 솔루션 )
( PK 구성 컬럼이 많은 통계성 테이블이 분석 관점과 엑세스 경로가 아주 다양할 시
BTree 결합 인덱스를 계속 추가는 저장공간이나 DML 부하 측면에 문제가 많아
그럴 때 테이블을 IOT로 구성하면 효과적 )
- 데이터 입력과 조회 패턴이 서로 다른 테이블
IOT 테이블의 정렬 순서
- 자주 사용하는 등치 조건을 선두에 구성하여 생성
파티션 IOT
- 파티션 IOT 구성시 컬럼 순서 중요
Overflow
- PK 이외 컬럼이 많은 테이블일수록 인덱스 분할에 의한 DML 부하는 물론,
검색을 위한 스캔량도 늘어나기 때문이다.
(인덱스 분할에 의한 DML 부하는 인덱스 분할의 부하로 인하여 발생하는가 ?)
- 이 부분의 영역은 값은 저장해 두지만 출력이나 조회조건으로 거의 사용되지 않는다.
- 오라클은 PCTthreshold 또는 Including 둘 중 하나를 만족하는 컬럼을 Overflow 영역에 저장
- overflow 영역을 읽을 때도 건건이 Random 엑세스가 발생한다.
- overflow 영역에도 buffer pinning 효과가 나타난다.
Secondary 인덱스
- 결론은 IOT는 Secondary 인덱스 추가 가능성이 크지 않을 때만 선택하는 것이 바람직하다.
- IOT Secondary 인덱스
● logical rowid = PK + Physical Guess
● PCT_Direct_Access 가 100 일 때 physical Guess를 사용할 수 있다.
- 오라클은 secondary 인덱스의 Logical Rowid가 인덱스 키와 중복되면 이를 제거하고
그 밖의 컬럼만 저장한다.
인덱스 클러스터 테이블
- 클러스터 키 값이 같은 레코드가 한 블록에 모이도록 저장하는 구조
한 블록에 모두 담을 수 없을 때는 새로운 블록을 할당해 클러스터 체인으로 연결
( 여러 테이블 레코드가 물리적으로 같이 저장될 수도 있다.)
- 클러스터 테이블을 생성하려면 클러스터와 클러스터 인덱스가 필요하다
- 클러스터 인덱스의 키 값은 항상 Unique하며 1:M 관계를 갖는다.
이런 특성 때문에 Random 엑세스가 값 하나당 한 번씩 밖에 발생하지 않는다.
- 클러스터 인덱스는 클러스터를 공유하는 테이블들이 공유해서 사용한다.
- 클러스터 테이블은 넓은 범위를 검색할 때 유용하다
인덱스 클러스터 테이블 종류
- 단일 테이블 인덱스 클러스터
- 다중 테이블 인덱스 클러스터
클러스터 테이블과 관려된 성능 이슈
- DML 성능이 다소 떨어지고 전에 없던 값을 입력할 때는 새로운 블록 할당 받아야 하기 때문에
더 느리다.
( 클러스터를 만들지 않고 인덱스를 생성했을 경우는 비슷하다.
클러스터로 인하여 기존 인덱스를 두세게 없앨 수 있다면 DML부하가 줄 수있다.
- 아직 테스트 못해봄 )
- data 삭제시
● truc 사용할 수 없음
● drop 발생시에도 내부적으로 건건이 delete 작업 발생
● 클러스터 자체를 지우는 것이 가장 빠르지만 클러스터를 지우면
클러스터링 된 테이블 모두 삭제 됨
DML 부하 외에 클러스터 테이블 관련한 성능 이슈
- Direct Path Loading을 수행할 수 없다.
- 파티셔닝 기능을 함께 적용할 수 없다. IOT의 경우는 Partitioned IOT가 가능하다.
- 다중 테이블 클러스터를 Full Scan 할 때는 다른 테이블 데이터까지 스캔하기 때문에 불리하다.
SIZE 옵션
- 하나의 블록에 담을 최대 클러스터 키 개수를 결정
- SIZE 옵션은 공간을 미리 예약해 두는 것일 뿐 그 크기를 초과했다고
값을 저장하지 못하도록 하지 않는다.
- SIZE 옵션 때문에 데이터 입력이 방해 받지 않지만 대부분 클러스터 키 값이 한 블록씩을
초과한다면 굳이 이 옵션을 두어 클러스터 체인이 발생하도록 할 이유는 없다.
해시 클러스터 테이블
- 해시 함수에 반환된 값이 같은 데이터를 물리적으로 함께 저장하는 구조
- 해싱 알고리즘을 이용해 클러스터 키 값을 데이터 블록 주소로 변환
- 가장 큰 제약은 등치조건 '=' 검색만 가능하다.
- 물리적인 인덱스를 따로 갖지 않기 때문에 해시 클러스터키로 검색할 때는 그만큼 블록I/O가
덜 발생한다는 이점이 생긴다.
'ORACLE > SQLP' 카테고리의 다른 글
성능고도화 1-8. 인덱스 설계 (0) | 2016.12.26 |
---|---|
성능고도화 1-7. 인덱스 스캔 효율 (0) | 2016.12.26 |
성능고도화 1-5. 테이블 random 엑세스 최소화 튜닝 (0) | 2016.12.26 |
성능고도화 1-4. 테이블 random 엑세스 부하 (0) | 2016.12.26 |
성능고도화 1-3. 다양한 스캔 방식 (0) | 2016.12.26 |