cd database/대용량데이터베이스

대용량 DB 7강 정리 (index의 사용)

성덕 2014. 5. 3. 08:51

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방식 : indexrowid를 비교해서 같은 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이어야 한다.