[오라클] 인덱스의 원리 및 개념과 종류(B-TREE, BITMAP INDEX)
안녕하세요.
오늘은 인덱스에 대해 포스팅하겠습니다.
오라클을 기준으로 하여 설명할 것 입니다
인덱스 개념 및 원리
인덱스의 개념
어떤 데이터가 어느 위치에 있다는 정보를 가진 주소록 같은 개념 입니다.
인덱스의 개념을 이해하기 위해서는 오라클이 select를 하는 원리를 알아야 합니다.
일반적인 select 쿼리를 실행될때 먼저 메모리의 데이터베이스 버퍼 캐시를 살펴봅니다.
버퍼 캐시에는 자주 사용되는 테이블들이 캐싱되어 있는데 여기서 데이터가 있을 경우에는 바로 찾아 출력하고
없을 경우에는 하드 디스크에 있는 데이터 파일에서 데이터를 찾기 시작합니다.
인덱스를 사용한다면 이러한 과정을 거치지 않고 바로 주소를 통해 찾아간다는 것이지요.
예를들어 홍길동 이라는 사람의 집에 택배를 배송하기위해 대한민국 전국을 뒤져야 합니다.(Full Scan)
하지만 인덱스를 사용한다면 바로 배송지로 택배를 배송할 수 있습니다.
이번엔 인덱스의 생성 원리를 알아보겠습니다.
인덱스의 생성 원리
해당 테이블을 모두 읽고 인덱스를 만드는 동안 데이터가 변경되면 문제가 되므로
해당 데이터들이 변경되지 못하도록 조치한 후 메모리(PGA의 Sort Area라는 곳)에 정렬하게 됩니다.
과정 : 전체 테이블 스캔 -> 정렬 -> Block 기록
인덱스의 종류
실제 테이블의 주소는 Leaf Block들에 전부 들어 있습니다.
해당 데이터들에 대한 데이터들이 Branch Block과 Root Block에 들어 있습니다.
특정 데이터는 찾아야 할 경우 Root Block 에서 Branch Block 정보를 찾고
그 다음 Leaf Block 정보를 찾아가서 해당 데이터의 ROWID를 찾아 데이터가 들어 있는 블록을 메모리로 복사해 옵니다.
B-TREE 인덱스의 종류로는
UNIQUE INDEX, Non UNIQUE INDEX, Function Based INDEX, DESCENDING INDEX, 결합 인덱스(Compisite INDEX) 등이 있습니다.
이중에서 눈여결 볼 인덱스는 결합 인덱스 입니다.
결합 인덱스는 인덱스를 생성할 때 두 개 이상의 칼럽을 합쳐서 인덱스를 만드는 것을 말합니다.
예를 들어 성별과 이름을 이용하여 데이터를 찾는다고 가정해보겠습니다.
테이블 데이터는 총 60건의 데이터가 존재합니다.
성별은 남자이고 이름은 홍길동 인 데이터를 찾아보겠습니다.
첫번째 사용 : 성별 + 이름
60명 -> '남자' -> 25명
25명 -> '홍길동' -> 2명
성별을 먼저 이용하니 총 25회의 검사가 필요하였습니다.
두번째 사용 : 성별 + 이름
60명 -> '홍길동' -> 2명
2명 -> '홍길동' -> 2명
이름을 먼저 이용하니 총 2회의 검사가 필요하였습니다.
위의 상황 처럼 인덱스의 사용 순서도 중요한 역할을 하게 됩니다.
BITMAP INDEX
B-TREE 형식의 인덱스는 주로 데이터의 값의 종류가 많고 동일한 데이터가 적을 경우에 사용하는 인덱스 였습니다.
BITMAP INDEX는 데이터의 값이 종류가 적고 동일한 데이터가 많을 경우에 사용 합니다.
이름처럼 데이터가 어디 있다는 지도정보를 Bit로 표시합니다.
데이터가 있으면 '1', 없으면 '0'으로 표시됩니다.
맵은 인덱스 컬럼의 개수 만큼 만들어 집니다.
예를들어 회원정보에 '지역' 이라는 컬럼이 있다면
서울 : 1 0 1 0 0 대전 : 0 1 0 0 1 대구 : 0 0 0 1 1 |
이런식으로 MAP이 생성됩니다.
이때 데이터가 '울산'이라는 데이터가 추가 된다면
BITMAP INDEX를 전부 수정해야하고 '울산' 이라는 MAP을 추가해야 합니다.
즉, B-TREE INDEX는 관련 블록만 변경되면 되지만 BITMAP INDEX는 모든 맵을 다 수정해야 한다는 큰 문제점이 있습니다.
그래서 주로 데이터가 변경이 안되는 테이블과 값의 종류가 작은 칼럼에 생성하는 것이 유리합니다.
다음에는 인덱스의 주의사항과 실제 사용 실습에 관해 포스팅하겠습니다.
고생하세요.
'개발 > DB' 카테고리의 다른 글
[오라클(oracle)] join update 힌트로 해결 (2) | 2020.03.04 |
---|---|
[oracle]오라클 시퀀스(sequence) 생성 및 삭제 (0) | 2019.12.03 |
[오라클] 인덱스의 주의사항 및 관리방법(쿼리문 확인) (0) | 2019.12.03 |
오라클(oracle) pivot, unpivot 함수 활용 예제 (0) | 2019.11.14 |
오라클(oracle) rank(), row_number() 순위함수 사용 예제 (2) | 2019.11.13 |
데이터베이스(DB) 정규화(1차,2차,3차) (0) | 2019.11.10 |
drop, delete, truncate 차이점 및 개념 이해하기 (4) | 2019.11.06 |