Clustering Factor란 Index의 테이블에 대한 정렬정도를 말합니다.
정렬정도를 측정하기 위해 오라클은 Clustering Factor의 수치를 Index를 scan하는동안 방문하게되는 Table의 Data Block의 갯수로 나타냅니다.
이는 Clustering Factor가 높아지면 읽어 들이는 Data Blcok의 갯수가 많아지기 때문에 Physical Reads가 높게 나온다는 것을 의미합니다.
Physical Reads는 Performance와 밀접한 관련이 있기 때문에 Clustering Factor를 최소화 하는 것이 튜닝의 중요 요소 중 하나라고 할 수 있습니다.
Good Clustering Factor
Good Clustering Factor란 Sequence Key나 Data Type을 사용하는 Index와 같이 Index 순서와 Table의 순서가 거의 완벽하게 일치하는 것을 말합니다.
Clustering Factor가 가장 좋은 경우에 클러스터링 팩터가 table의 Data Block 수 만큼 발생하게 됩니다.
Clustering Factor = 1
단, FLM인 경우에는 freelist의 값이 1이상이며 동시에 insert 작업이 수행되면 동일 블록에 경합이 발생하면서 process들이 서로 다른 free block을 사용하게 되어 Clustering Factor는 높아지게 됩니다.
그리고 ASSM인 경우에는 복잡하고 다차원적으로 free block을 관리하기 때문에 최적화된 Clustoring Factor 상태에서도 table의 data block수 보다 Clustorfing Factor가 더 높아지는 경향이 있습니다.
Bad Clustering Factor
Bad Clustering Factor는 Good Clustoring Factor와 반대로 Index Key 값이 Random하게 할당되거나 Reverse Index Key와 같이 Index 순서와 Table의 순서가 일치하지 않는 경우를 말합니다.
Clustering Factor가 가장 나쁜 경우에는 Clustoring Factor가 table의 row의 수만큼 발생하게 됩니다.
이런 경우에는 전체 Data Blcok에서 1%의 데이터만 읽어도 Table Full Scan 을 하는 경우보다 더 많은 Cost가 발생하기 때문에 CBO는 Table Full Scan을 선택하는 경우가 발생합니다.
Clustering Factor = 3
Clustering Factor의 값을 줄일 수 있는 방법은 Index Key를 변경하거나 Table을 재생성 하는 것입니다. 하지만 Index Key를 바꾸는 것은 매우 제한적이어서 table을 재생성하는 것이 유일한 방법입니다.
Clustering Factor와 Index Scan Cost와의 연관성
Index Scan Cost 계산 공식은 Cost = Blevel + ceil(Leaf Blcoks * Index Selectivity) + ceil(Clustering Factor * Table Selectivity) 입니다.
보통 Blevel과 Leaf Blcok의 수는 적은값을 차지하기 때문에 Clustering Factor가 주는 영향은 매우 큽니다.
또한 Index Lookup의 Cost는 실제 Data를 읽는 일량을 결정하기 때문에 성능 개선에서 Clustering Factor를 줄이는 것이 얼마나 중요한지를 알 수 있습니다.
'오라클 > Tuning' 카테고리의 다른 글
Nested Loop 예제 (0) | 2010.05.16 |
---|---|
select * from t1 sort ? ㅋ (0) | 2010.05.09 |
Nested Loop (0) | 2010.05.08 |
Join 관련 용어 (0) | 2010.05.08 |
Oracle Data Access Pattern (0) | 2010.05.08 |