Oracle/용어정리2010. 2. 22. 14:34

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

군집성 계수(= 데이터가 모여있는 정도)라고 번역될 수 있다.
데이터베이스에서는 특정 컬럼을 기준으로 같은 값을 갖는 데이터가 서로 모여있는 정도를 의미한다.
"인덱스 클러스터링 팩터가 좋다."고 하면 인덱스 정렬 순서와 테이블 정렬 순서가 서로 비슷하다는 것을 말한다.


클러스터링 팩터는 왜 알아야 하는가?

두가지 면에서 성능에 영향을 미치기 때문이다.
1. Index Scan의 Cost에 큰 영향을 준다.
2. Index Lookup을 통해 Data를 읽는 일량을 결정한다.


클러스터링 팩터는 어느 테이블, 어느 컬럼에서 확인할 수 있을까?

dba_indexes,
all_indexes,
user_indexes테이블의  clustering_factor컬럼에서 확인할 수 있다.


클러스터링 팩터의 값은 어떻게 계산되어 나오는 것일까?

clustering_factor 계산을 위해서 오라클이 사용하는 아래의 로직을 보고 나면 값을 유추해낼 수 있다.

1. counter 변수를 선언.
2. 인덱스 리프 블록을 처음부터 끝까지 스캔하면서 인덱스 rowid로부터 블록 번호를 취함. 
3. 현재 읽고 있는 인덱스 레코드의 블록 번호가 바로 직전에 읽은 레코드의 블록 번호와 다를 때마다 counter값을 1씩 증가시킨다.
4. 스캔을 완료하고서, 최종 counter변수 값을 clustering_factor로서 인덱스 통계에 저장한다.

테이블 통계를 수집하지 않고, clustering_factor를 구하는 스크립트 =>> 클릭


그럼 실제적으로 테스트를 통해 클러스터링 팩터를 확인해보자.


1. 1000개의 데이터가 index와 같은 순서로 되어있을 경우


OS] sqlplus test/test
SQL> create table t1(col1 number, col2 varchar2(10));
SQL> insert into t1
     select level, 'test'
     from dual
     connect by level <= 1000;


클러스터링 팩터 : 4

SQL> select index_name, table_owner, table_name, clustering_factor
     from user_indexes
     where index_name = 'T1_COL1_IDX';

 

INDEX_NAME TABLE_OWNER TABLE_NAME CLUSTERING_FACTOR
T1_COL1_IDX TEST T1 4


2. 1000개의 데이터가 index와 정반대의 순서로 되어있을 경우


OS] sqlplus test/test
SQL> create table t2(col1 number, col2 varchar2(10));
SQL> insert into t2
     select 1001-level, 'test'
     from dual
     connect by level <=1000;

SQL> create index t2_col1_idx on t2(col1);


클러스터링 팩터 : 4

SQL> select index_name, table_owner, table_name, clustering_factor
     from user_indexes
     where index_name = 'T2_COL1_IDX';


INDEX_NAME TABLE_OWNER TABLE_NAME CLUSTERING_FACTOR
T2_COL1_IDX TEST T2 4



3. 1000개의 데이터가 랜덤으로 되어있을 경우

OS] sqlplus test/test
SQL> create table t3(col1 number, col2 varchar2(10));
SQL> insert into t3
     select dbms_random.value(1,1000), 'test'
     from dual
     connect by level <= 1000;
SQL> create index t2_col1_idx on t3(col1);


클러스터링 팩터 : 881

SQL> select index_name, table_owner, table_name, clustering_factor
     from user_indexes
     where index_name = 'T3_COL1_IDX';


INDEX_NAME TABLE_OWNER TABLE_NAME CLUSTERING_FACTOR
T3_COL1_IDX TEST T3 881



참고 : Optimizing Oracle Optimizer p.117 ~ 137
         오라클 성능 고도화 원리와 해법 2  P.67 ~ 78

'Oracle > 용어정리' 카테고리의 다른 글

TPS 란?  (1) 2011.02.02
BCP (Business Continuity Planning)  (0) 2010.12.26
정규화란?  (1) 2010.02.04
옵티마이져(Optimizer)란?  (0) 2010.02.04
FGA  (0) 2009.12.23
Posted by 자수성가한 부자