728x90
반응형
SMALL

* Youtube Link - https://www.youtube.com/watch?v=fbqJDc5PJJc&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=24

 

인덱스의 내부 작동

- B-Tree (균형 트리)

루트 블럭과 리프 블럭으로 구성되어 있다.

오라클에서는 한 블럭 당 8k정도 된다.

루트 블럭은 각각의 리프 블럭의 첫 데이터만 가지고 있다고 볼 수 있다.

리프 블럭에 데이터들은 동일하게 들어있다.

찾을 때는 루트 블럭을 통해서 일일이 찾을 데이터를 더 빨리 찾을 수 있다.

예를 들어 3만개의 리프 블럭이 있어도 2-3개의 블럭만에 찾을 수 있도록 하는 것이 바로 B-TREE 구조이다.

- 인덱스 분할

인덱싱해야 하기 때문에

루프 블럭과 리프 블럭에서 '인덱스 분할'이 일어난다.

데이터를 입력하려고 하는데 블럭의 저장공간이 예를 들어 모자라면

블럭을 옮기는 작업을 하는데 이것이 인덱스 분할이다.

페이지를 나누는 일은 페이지 입장에서 굉장히 큰 일을 한 것이다.

인덱스 분할이 많이 일어날수록 성능이 많이 떨어진다.

- 중간 노드의 생성

이렇게 QQQ를 삽입하기 위해서 3개의 PAGE가 만들어졌다.

그리고 루트 블럭이 하나가 추가가 되면

이를 중간 블럭으로 바꾼다. 그리고 새로운 루트 블럭을 생성한다. 데이터 조회하는 행의 수를 줄이기 위함이다.

이렇게 블럭들이 추가가 되면 데이터베이스 입장에서는 굉장히 많은 일들을 한 것이다.

실습

이렇게 데이터들을 입력을 하면 오른쪽에 그림과 같이 데이터 블럭으로 나누어 진다.

이는 인덱스가 없는 테이블의 내부 구성이다.

- rowid를 통한 메모리 주소 확인

rowid를 통해서 메모리의 주소를 파악할 수 있다.

이렇게 데이터들이 메모리에 적재된 것을 볼 수 있다.

- 인덱스 생

PK를 생성 후 다시 조회를 했다.

데이터 블럭은 변화가 일어나지는 않는다.

대신 인덱스 블럭이 새로 만들어진다.

리프 블럭 두개에 각각 값만 올라간다. 그리고 PK 값들은 리프 블럭에서 정렬이 된다. 

그리고 각각의 블럭의 루트 블럭이 생성된다. 루트 블럭 또한 정렬되어 있다.

각각의 데이터 블럭은 rowid를 통해서 가리키게 된다.

그리고 2건의 데이터를 입력하였다.

그리고 데이터를 조회해보면

순서대로 입력된 것을 볼 수 있다.

이렇게 데이터 블럭에는 순서대로 데이터가 저장되지만

인덱스 블럭이 생성되어 루트 블럭과 리프 블럭을 통해서 인덱스가 만들어지고 데이터의 메모리 주소가 저장되는 것을 볼 수 있다.

인덱스 블럭에는 다시 PK값과 rowid(메모리 주소)를 저장하고, 인덱스 블럭에서 데이터들이 PK 기준으로 알파벳 순으로 정렬되어 있다. 그래서 빠르게 찾을 수 있다.

하지만  데이터를 범위로 찾는 것이 아니라 개별적으로 대용량의 데이터를 검색한다면 이 또한 성능이 나빠질 수 있다.

여러번 인덱스 블럭과 데이터 블럭을 오가기 때문이다.

- 인덱스가 많아지면 데이터를 입력할 때 그 만큼 만들어야할 인덱스도 많아지게 된다.

- WHERE 절에 해당 인덱스 열이 나와야 인덱스가 사용된다. 그러나 사용되지 않는 경우도 많다.

 

감사합니다.

728x90
반응형
LIST

+ Recent posts