Developers Haven

(DH)블로그는 개발자들이 기술 정보를 찾아볼 수 있는 안식처가 되고 싶음을 희망하여 시작하게 되었습니다. 공부한 내용과 성장 과정을 기록해두었으니 편히 둘러보시길 바랍니다.

Welcome to DH's Blog

[기술공부]/Data

SQL튜닝 - 인덱스의 종류에 대하여 (클러스터/비클러스터 인덱스)

DH’s Blog 2023. 10. 27. 16:07
반응형

우리는 지난 시간에 인덱스가 무엇인지에 대해서 알아보았고, 만약 못봤다면 아래 페이지를 참고하도록 하자. 한마디로 요약하자면 인덱스는 데이터의 검색 속도를 향상시켜주는 자료 구조로, 단일 혹은 여러 개의 컬럼을 이용하여 인덱스를 생성할 수 있다. 이번 시간에는 인덱스의 종류에 대해서 알아보도록 하자.

 

[참고] 지난 시간 내용 - 인덱스에 대하여

2023.10.27 - [[기술공부]/Data] - SQL 튜닝 - 인덱스에 대하여

 

SQL 튜닝 - 인덱스에 대하여

DB 업무를 하다보면 같은 결과를 보여주는 쿼리라도 어떤 문법과 실행 방식을 사용하는지에 따라 쿼리 성능이 매우 달라진다. 특히 빅데이터 솔루션 회사에 근무를 하다보니 데이터 용량이 큰

developers-haven.tistory.com

 

 

인덱스의 종류에 대해 알아보기에 앞서, 데이터베이스 구조와 원리에 대해 짧게 알아보자.

 

 

저장 공간은 크게 휘발성, 비휘발성 저장공간으로 분류된다. 휘발성은 전원 공급이 차단되면 가지고 있던 데이터가 모두 사라진다는 특징이 있고 대표적인 것이 '메모리'이다. 반면 비휘발성은 전원 공급이 중단되어도 영구적으로 데이터를 저장할 수 있다는 특징이 있고 대표적인 것이 '디스크'이다. 데이터를 저장하는 데이터베이스(DB)에서도 전원 공급과 상관없이 데이터를 저장할 수 있어야 하기 때문에 디스크에 데이터를 저장하고 있다.

 

 

그리고 DBMS는 사용자의 요청이 들어오면 실제 데이터가 저장된 디스크에서 메모리로 데이터를 올려서 처리한다. 이때, 디스크와 메모리 간의 데이터 I/O페이지 단위로 이뤄진다. (오라클에서는 '블록'이라하며 SQL 서버에서는 '페이지' 단위라고 부른다) 쉽게 생각해서 데이터 저장 단위를 페이지라고 부른다고 이해하면 된다. 예를 들어 페이지의 크키가 너무 작으면 한번에 읽을 수 있는 데이터의 양이 줄어들고, 반대로 페이지가 너무 크면 필요 없는 데이터를 함께 읽어야 해서 메모리 공간을 낭비하게 될 수 있다.

 

 

다시 정리해보면, 페이지란?

- 디스크와 메모리에 데이터를 읽고 쓰는 작업의 최소 단위(=I/O 단위)이다.
- 보통 16 Kbyte 크기의 최소 저장 단위이며, DBMS 종류에 따라 페이지 단위는 달라진다.
- 실제 SQL 서버 접근시에 페이지 단위로 접근하며, 데이터를 조회하는 쿼리문이 실행되면 페이지에서 데이터가 select 된다.

 

RID(RowID)란?

- 데이터베이스 내의 데이터가 가진 실제 주소로, 이 주소를 가지고 원하는 데이터에 접근할 수 있다.
- 각 데이터를 구분할 수 있는 ID이며, 데이터마다 서로 다른 ID를 가지고 있다.

 

 

추가로, 데이터베이스에서 실제 데이터가 저장되는 곳Heap 영역이라 한다. (쉽게 설명해보자면) 인덱스 종류는 인덱스 & 데이터를 함께 관리하는 클러스터 인덱스 OR 인덱스에 대한 정보를 따로 관리하는 비클러스터 인덱스로 나뉘게 되는데 아래 그림을 보면서 설명해보도록 하겠다.

 

 

 


 

인덱스의 종류

 

1. 클러스터 인덱스(Clustered Index)

 

Clustered Index

- B-Tree 구조를 가지는 가장 일반적인 인덱스 종류이다.

- Leaf 노드에서 인덱스는 항상 정렬된 상태를 유지하며, 인덱스에 실제 데이터를 함께 저장하고 있다.

- 쉽게 생각하면 인덱스를 기준으로 실제 테이블 데이터가 항상 정렬된 상태를 유지한다고 이해하면 된다.

- 인덱스 기준으로 정렬되므로 인덱스로 가장 적합한 컬럼 하나만을 클러스터 인덱스로 지정하며, 대표적인 것이 PK(Primary Key)이다.

 

클러스터 인덱스의 장단점

- 장점) 인덱스 기준으로 데이터가 함께 정렬된 상태를 유지하므로 검색 속도가 빠르다.

- 단점) 데이터 insert / update / delete 마다 전체 데이터 페이지 정렬이 필요하므로 속도가 느리다.

 

 

 

 

2. 비클러스터 인덱스(Non-Clustered Index)

Non-Clustered Index

- 인덱스 페이지를 별도로 관리하며, 실제 데이터가 저장된 Heap 영역과는 분리된 구조이다.

- Leaf 노드에서 인덱스는 RID(=RowID, 데이터 주소)를 가지며, RID 값을 이용하여 실제 데이터가 저장된 Heap 영역에 접근한다.

- 쉽게 생각하면 인덱스 페이지만 관리하고, 실제 테이블 데이터는 따로 정렬하지 않은 상태를 유지한다고 이해하면 된다.

- 클러스터 인덱스와 달리 여러 개의 인덱스 생성이 가능하지만 남용하면 성능이 떨어질 수 있기 때문에 주의가 필요하다.

 

비클러스터 인덱스의 장단점

- 장점) 실제 데이터 페이지는 정렬되지 않으므로 데이터 insert / update / delete 작업의 속도가 빠르다.

- 단점) 인덱스만 정렬되고, 실제 데이터는 정렬되어 있지 않으므로 클러스터 인덱스에 비해 검색 속도가 느리다.

 

 

 

 


 

클러스터 인덱스, 비클러스터 인덱스를 처음 접한 것이라면 이 내용이 조금 어려울 수 있을 것 같아서 다른 예시를 한번 들어보겠다. (같은 회사 김개발 사원의 연락처를 찾는 상황이라 가정해보자)

 

* 클러스터 인덱스 : 인덱스를 가지고 Leaf 노드까지 탐색해서 원하는 데이터를 바로 얻을 수 있다.

 

* 비클러스터 인덱스 : 인덱스를 가지고 Leaf 노드에 탐색해서 데이터 위치만 얻고, 실제 Heap 영역에 접근하여 데이터를 얻을 수 있다. (인덱스 페이지는 항상 정렬을 유지하지만 데이터는 정렬하지 않은 상태로 보관한다)

 

 

 

 

처음 공부할때는 페이지가 무엇인지, RID가 무엇인지를 모두 이해하려다보면 이 내용이 되게 어렵게 다가올 수 있다. 하지만 위의 '김개발님의 연락처 찾기'에 들어둔 예시 정도만 이해했다면 반 정도는 이해한 것이다. 그러니 처음부터 모든 내용을 이해하려고 하지 말고, 의미만 먼저 파악하고 조금씩 개념적으로 들어가보는 것을 추천한다. 이 내용이 많은 사람들에게 도움이 되었으면 좋겠다:)

 

 

 

반응형