[ Oracle.튜닝-Index ]
1. index
a. 많은 양의 페이지를 읽을 때
- 본문을 처음부터 끝까지 쭉 읽는 것이 빠를 가능성이 높다.
b. 적은 양의 페이지를 읽을 때
1. Step
색인을 뒤져서 페이지 번호를 찾는다.
2. Step
본문의 해당 페이지로 찾아 간다.
2. Index 분류
a. B*Tree Index
b. Bitmap Index
c. Reverse Key Index
d. Descending Index
e. Function-based Index (FBI)
f. Domain indexes Index
3. B*Tree Index
a. 구성요소
. Root Block -> Branch Blocks -> Leaf Blocks
b. Root Block, Branch Blocks
. 이 2개의 Block에는 data block에 접근하는 자료는 없다.
c. Leaf Blocks
. data block에 접근할 수 있는 rowid를 가지고 있다.
. Leaf Node Block은 서로 양방향으로 연결되어 있다.
4. rowid
a. 구성 : Object ID + File Number + Block Number + Row 위치 (Block내)
5. 결합인덱스
a. 선행컬럼 선정순서
1. 조건절에서 해당 컬럼이 항상 사용되는가
2. 조건절에서 항상 '='로 사용되는가
3. 컬럼의 분포도가 좋은가
4. 정렬(sort)를 대신 할 수 있는가
* 즉, index 컬럼 순서는 분포도 보다 '=' 검색이 더 우선 순위가 더 높다.
b. 후행컬럼 선정기준
1. 범위연산자로 조회되는 경우 (Between)
c. 예제
1. 만약, 급여테이블이 존재 할 때
급여년월 + 사원번호 + 급여액 이라는 index가 존재 할 때 적절한지 파악해보면
; 급여년월은 주로 '=' 로 검색하고
; 사원번호, 급여액은 between 으로 검색하기에 적절하게 된다.
2.
c. 실행계획
1. INDEX SKIP SCAN
. A + B + C 에 대한 index가 존재 할 때
where B = '12' AND C = '가가'; 로만 조건절에 적용시 11g 부터 적용될 실행계획임
. 첫 번째 선행컬럼(A)의 데이터 분포도가 나쁘고 (고유한 값이 작고 중복된 값이 많은 경우)
. 두 번재 선행컬럼(B)의 데이터 분포도가 좋은 경우 (고유값이 많고 중복이 적은 경우)
. skip의 효과가 좋은 것이지, 모든 경우에 효율성이 좋은 것은 아님
6. 인덱스를 사용하지 못하는 경우
a. 인덱스 사용이 비효율적인 경우
b. 비교가 불가능한 경우
7. 인덱스와 힌트
a. INDEX ~ 특정 인덱스를 사용하도록 유도하는 힌트
. SELECT /*+ INDEX(emp_large EMP_IDX01) */ ..
b. INDEX_ASC ~ 인덱스를 오름차순으로 접근하도록 하는 힌트
. SELECT /*+ INDEX_ASC(emp_large EMP_PK) */ ..
c. INDEX_DESC ~ 인덱스를 내림차순으로 접근하도록 하는 힌트
. SELECT /*+ INDEX_DESC(emp_large EMP_PK) */ ..
8. Function-based Index (FBI)
a. Index가 걸려 있는 컬럼에 계산식이나 함수가 사용되는 경우에는 Index를 사용할 수 없음
b. FBI는 컬럼에 계산식이나 함수를 적용하여 자주 조회를 하는 경우에 사용가능
10. 용어
a. 분포도가 좋다.
. 고유한 값이 많다.
. 데이터 처리 범위가 좁다.
. 처리 일량이 적다
b. 분포도가 나쁘다.
. 중복된 값이 많다.
. 데이터 처리 범위가 넓다
. 처리 일량이 많다.
'(DB) Oracle 튜닝 > 쌍용튜닝교육' 카테고리의 다른 글
Oracle. 실행계획 - 자원통계정보 (0) | 2018.02.25 |
---|---|
Oracle. 실행계획 - 기타연산자 (0) | 2018.02.25 |
Oracle. 실행계획 - JOIN (0) | 2018.02.25 |
Oracle. 실행계획 (0) | 2018.02.24 |
Oracle.PL/SQL(Anonymous Block, Stored Block) (0) | 2018.02.24 |