몇일전에 Clustered Index와 Non-Clustered Index에 대해 저에게 물어보신 분이 계셨습니다. 제 기억 속에는 Clustered Index는 Primary Index와 비슷한 어구인가? 라는 생각과 테이블 당 1개만 생성할 수 있는 뜻이지 않을까 라는 유추만할 수 있을 뿐 전혀 모르겠었습니다. 또한 Primary Index와 Clusterd Index의 명확한 차이점을 모르기도 했습니다.
그래서 제 기억 속에 오랫 동안 자리 잡기를 바라는 마음으로 정리합니다.

데이터베이스에서 테이블의 데이터 탐색 속도를 향상시켜주기 위해 인덱스라는 개념을 제공하고 있습니다. 인덱스는 컬럼 단위로 생성되며, 하나의 컬럼 혹은 여러개의 컬럼에 인덱스를 지정할 수 있습니다. 또한 모든 질의는 먼저 인덱스를 찾아보고, 그것이 가리키는 행을 찾아 결과로 사용합니다.

Priamary Index vs Secondary Index

Primary Index

기본 인덱스는 데이터 행들이 저장되는 물리적 위치에 영향을 끼칩니다. 그 이유는 기본 인덱스를 기준으로 데이터를 물리적으로 배열하기 때문입니다.

위 이미지에서 인덱스 블록(왼쪽)에서 어떻게 인덱스 엔트리가 데이터 블록(오른쪽)의 대응되는 행을 가리키고 있습니다. 인덱스 블록에서 데이터 블록까지 순서가 공통되게 정렬되어 있는 모습을 볼 수 있습니다. 추가적인 특징은 하나의 테이블에는 오직 하나의 기본 인덱스만 가질 수 있습니다.

Secondary Index

보조 인덱스의 유무에 따라 실제 데이터 행이 저장되는 물리적 위치에 영향을 끼치지 않습니다. 그 이유는 별도의 공간에 인덱스 테이블을 생성하여 데이터를 정렬합니다. 아래의 이미지로 이해하는데 도움이 될 수 있을 것 같습니다.

위 이미지에서 인덱스 블록(왼쪽)의 인덱스 엔트리들이 데이터 블록(오른쪽)의 대응되는 행을 가리키고 있습니다. 인덱스 블록에서 데이터 블록의 순서가 뒤죽박죽인 것을 볼 수있습니다. 즉, 데이터 블록은 보조 인덱스 키에 대하여 정렬된 행을 유지하지 않습니다.

그렇다면 여러 컬럼을 보조 인덱스로 선언해야 유리한게 아닐까? 라는 생각이 들 수 있습니다. 하지만 보조 인덱스는 일반적으로 밀집 인덱스이므로 같은 수의 레코드들을 접근할 때 보조 인덱스를 통하면 기본 인덱스를 통하는 경우보다 디스크 접근 회수가 증가합니다.

 

Clustered Index vs Non-Clustered Index

위에서 간략하게 Primary Index와 Secondary Index의 설명을 보셨으니, 클러스터 인덱스와 논클러스터 인덱스를 더욱 이해하기 쉬울 것 같습니다.

Clustered Index

클러스터 인덱스는 기본적으로 Primary Index와 같이 데이터를 물리적으로 정렬합니다. 그리고 각각의 상이한 키 값마다 하나의 인덱스 엔트리가 인덱스에 포함됩니다. 이러한 구조의 특징은 범위 질의에 유용하다는 점입니다. 시작 값에 해당하는 인덱스 엔트리를 먼저 찾고, 범위에 속하는 인덱스 엔트리들을 따라가면서 레코드를 검색할 때 디스크 접근 회수를 최소화할 수 있습니다.

Non-Clustered Index

비 클러스터형 인덱스를 생성할 때 데이터의 물리적 위치를 변경하지 않습니다. Secondary Index와 같이 별도의 인덱스 테이블을 생성하여 데이터를 정렬합니다. 정리된 인덱스 테이블은 데이터가 위치하는 주소를 가지고 있습니다. 또한 클러스터형 보다 검색 속도는 느리지만, 데이터의 입력/수정/삭제는 더 빠릅니다. 비 클러스터형 인덱스를 여러개 생성할 수 있지만, 함부로 남용할 경우 오히려 성능 저하가 발생할 수 있으니, 반드시 손익 분기점을 확인하면 좋을 것 같습니다.

'보안 > DBMS' 카테고리의 다른 글

SQL Injection 이란? (SQL 삽입 공격)  (0) 2021.08.25