본문 바로가기
데이터베이스

ROWID와 클리스터링 팩터(CF)의 관계는?

by 데이널 2024. 5. 21.

인덱스의 구조를 살펴보다 보면 ROWID와 클러스터링 팩터라는 개념이 나옵니다. 데이터베이스 Index의 흥미로운 주제인 'ROWID'와 클러스터링 팩터 간의 관계를 살펴보겠습니다. 이러한 개념은 약간 기술적으로 들릴 수 있지만 이를 이해하면 데이터베이스 성능 튜닝 한 걸음 다가갈 수 있습니다.

 

 

ROWID란?

데이터베이스에서 'ROWID'는 테이블의 각 행에 대한 고유 식별자입니다. 데이터베이스 파일 내 행의 정확한 실제 주소라고 생각하면 되는데요. 테이블을 쿼리 할 때 데이터베이스는 'ROWID'를 사용하여 원하는 특정 행을 빠르게 찾을 수 있는 역할을 합니다.

 

ROWID 구성 포맷
ROWID 구성 포맷

 

인덱스 입장에서 보면, 테이블 레코드를 찾아가는데 필요한 주소라고 할 수 있는데요. ROWID는 그림처럼 데이터파일번호, 블록번호, 로우번호 같은 위치정보로 구성되어 있습니다. 


단 테이블 레코드를 찾아가기 위한 위치 정보일 뿐, 물리적으로 직접 연결된 구조는 아닙니다. ROWID는 테이블에 저장되는 것이 아니라 Index Leaf Block에 저장됩니다. 테이블 입장에서는 본인이 테이블 주소를 가질 이유가 없으니까요. 하지만 인덱스가 없는 테이블에도 ROWID가 나오는데요. 이유는 내부적으로 물리적 위치정보를 보여주기 위함입니다. 인덱스의 구조는 링크를 참고하시기 바랍니다. 

 

 

클러스터링 팩터(Clustering Factor, CF)란?

클러스터링 팩터는 인덱스를 기준으로 테이블의 행이 얼마나 잘 정렬되어 있는지를 나타내는 지표입니다. 기본적으로 이는 테이블의 행 순서가 인덱스의 행 순서와 얼마나 밀접하게 일치하는지 알려줍니다. 인덱스 컬럼 기준으로 테이블에 데이터가 얼마나 모여 있는지 정도를 의미하죠. 

 

클러스터링 팩터가 좋다는 것은 테이블 행이 인덱스 키와 비슷한 순서로 되어 있어 데이터 검색이 더 효율적이라는 것을 의미합니다. 반대로, 클러스터링 팩가 높을수록 테이블 행이 무작위로 분산되어 액세스 패턴의 효율성이 떨어짐을 의미합니다. 

 

클러스터링 팩터 좋은 인덱스 vs 나쁜 인덱스

 

 

클러스터링 팩터 계산식

클러스터링 팩터가 좋은 인덱스는 검색 효율이 좋습니다. 하지만 모든 인덱스의 클러스터링 팩터가 좋을 수는 없습니다.  대체적으로 CF가 좋은 인덱스는 테이블당 1개 정도입니다. 보통 가장 자주 사용되는 인덱스를 기준으로 하는 것이 성능에 유리합니다. 

그렇다면 클러스터링 팩터의 계산 방식은 어떻게 될까요? 계산방식은 아래 수식처럼 같은 블록에 있으면 CF를 증가시키지 않고, 블록이 달라지면 CF를 1씩 증가 시킵니다. 모두 다른 블록에 있다면 최댓값인 Table의 row수와 같게 될 것이고, 최솟값은 인덱스 블록 수만큼만 증가할 것입니다.  

  • CASE WHEN (현재 값 Block)  =  (이전 값 Block) THEN (CF) + 0  ← 같은 블록에 있으면 CF를 증가시키지 않음
  •            WHEN (현재 값 Block) <> (이전 값 Block) THEN (CF) + 1  ← 다른 블록이면 CF를 1 증가 시킴
  • 최소값 : Index Block 수
  • 최댓값 : Table row 수

위 산출식으로 보면 주수가 낮을수록 좋습니다. Buffer pinning 효과를 극대화할 수 있으며 Random I/O는 감소합니다. 

 

ROWID와 클러스터링 팩터의 관계

1. 물리적 row 순서와 논리적 순서

클러스터링 팩터는 row의 물리적 순서('ROWID'로 식별됨)와 인덱스로 정의된 논리적 순서 사이를 연결합니다. row가 인덱스 키와 동일한 순서로 물리적으로 저장되면 클러스터링 팩터가 좋아집니다. 이 시나리오는 데이터베이스 엔진이 데이터를 보다 효율적으로 검색하여 I/O 작업 수를 줄일 수 있습니다.


2. 클러스터링 팩터 활용

클러스터링 팩터가 낮을수록 행을 검색하는 데 필요한 블록이 적다는 말입니다. 이는 블록 읽기 횟수가 줄어들어 인덱스 스캔 성능이 향상됩니다. 클러스터링 팩터가 낮으면 인덱스를 읽을 때 Sequential Access 작업이 일어나 더 빨라집니다.

 

반면, 클러스터링 팩터가 높다는 것은 행이 여러 블록에 분산되어 있다는 이야기 입니다. 그러면 Random I/O 작업이 더 많아지고 성능이 느려짐을 의미합니다. 이렇게 클러스터링 팩터를 확인해서 성능에 미치는 영향을 확인하고 대응할 수 있습니다. 


3. 테이블 유지 관리 및 인덱스 리빌드

인덱스 리빌드와 같은 정기적인 작업을 통해 클러스터링 팩터를 좋게 할 수 있습니다. 인덱스에 크게 의존하는 쿼리는 I/O 작업 증가로 인해 속도가 느려질 수 있습니다. 이러한 경우 테이블을 재구성하여 행 순서를 개선하거나 인덱싱 전략을 다시 고려하면 성능이 크게 향상될 수 있습니다. 

 

 

예시)
'직원ID' column에 인덱스가 있는 테이블이 있다고 가정하겠습니다. 직원이 무작위 순서로 Insert된 경우 row의 물리적 저장소가 '직원ID'의 인덱스 순서와 일치하지 않을 수 있습니다. 시간이 지남에 따라 이로 인해 클러스터링 팩터가 나빠져 쿼리 성능이 저하될 수 있습니다. 인덱스를 리빌드 하거나 테이블을 재구성하면 row 순서를 인덱스에 맞춰 클러스터링 팩터를 좋게하고 성능을 향상할 수 있습니다.