대용량 DB 7강 정리 (index의 사용)
l B-tree Index
- 인덱스는 data 와 rowid로 구성되어 있다.
- B-tree Index는 트리에서 어느 쪽으로든 밸런스를 유지시키기 위해 노력하는 알고리즘이다.
- 이를 위해서는 먼저 소트 작업이 선행되어야 하고, 같은 값이면 rowid순으로 정렬되어 있다.
( rowid = block Addr + location + file Addr )
l 인덱스를 사용하지 않는 경우
- 절대 좌변을 가공하지 말것.
- DNAME LIKE '%ABC%' 나 '%ABC'는 인덱스를 타지 않음.
- JOB <> 'SALES'(부정형 비교)
(비트맵 INDEX에서는 인덱스 사용가능)
- DNAME IS NOT NULL (값을 모른다.. 모르는 값은 소트 불가능)
(** 결합인덱스로 만들어져 있을 때는 사용 가능하지만, 해당 컬럼이 제일 뒤로 감)
- WHERE JOB LIKE 'ABC%'
AND DNAME = 'ABC' 에서 두 조건 모두 인덱스가 존재할 때 우선순위에 의해 EQUAL조건에 따른 인덱스가 사용된다.
l 인덱스 컬럼 변형
- 절대 좌변을 가공하지 말것!!
- 의도적으로 인덱스를 타지 않도로고 suppressing 하는 경우도 있음.
l Suppressing 예제
- Where의 두 조건이 모두 인덱스가 있고, 우선순위도 같은 경우에는 index merge방식으로 실행된다.
n Index merge방식 : 두 index의 rowid를 비교해서 같은 rowid를 찾는 방식으로 table access
- 두 index에서 하나의 조건의 범위가 너무 넓을 경우에는 오히려 그 인덱스는 사용 안 하는 것이 좋다.
- 두 조건이 모두 like 일 경우에는 index merge방식을 절대 택하지 않는다. 둘 중의 하나만 선택하는데 가장 최근에 만들어진 index를 선택하여 사용한다.
- Join 시 옵티마이저는 연결 고리부터 확인한다. join 조건이 오래 걸릴 경우에는 다른 index를 확인하도록 좌변을 가공해주면 된다.
l 인덱스 컬럼 변경(internal)
- 데이터타입이 같으면 인덱스 유 -> 무로 드라이브한다.
- 데이터타입이 다르면 무 -> 유로 드라이브한다. 인덱스를 쓸 수 없는 것부터 접근한다.
- 조건에 where x.key(숫자) = y.key(문자)일 경우 varchar가 number로 바꿔서 비교한다.
- 연결고리가 되는 데이터타입 (PK , FK)은 반드시 데이터타입이 같아야 한다.
n 예) where x.key(숫자) = y.key(문자) and x.aa = ‘100’ 의 조건일 때 x.aa부터 보는 것이 아니라, y.key에서 드라이빙 되는 조건부터 실행되기 때문이다.
- Join은 어느 한쪽이 반드시 1이어야 한다.(1:N)
l 부정형 비교
- 부정형을 사용하려면 데이터 추출을 최적화 할 수 있는 부분을 찾는 것이 좋다.
- A테이블에서 조건이 되는 컬럼을 뽑은 다음에 B테이블에서 not exist 조건을 쓴다.
l NULL, NOT Null
- null값은 모르는 값이다. 이 값도 하나의 값! 이 값은 어떤 값과도 비교될 수 없기 때문에 비교될 수 없음.
- null값을 만들 지 않도록 default를 지정하라.
- 결합인덱스의 구성 컬럼이 된다면 반드시 NOT NULL이어야 한다.
- 입력 조건 값으로 자주 나오는 경우에도 반드시 NOT NULL이어야 한다.