관리 메뉴

Data Modeling Evangelist Kaien Kim's Blog

Clustring Factor에 대한 考察 본문

DATA/Oracle

Clustring Factor에 대한 考察

2007. 8. 27. 21:13
by Oracle? Database Reference
CLUSTERING_FACTOR NUMBER Indicates the amount of order of the rows in the table based on the values of the index.
  • If the value is near the number of blocks, then the table is very well ordered. In this case, the index entries in a single leaf block tend to point to rows in the same data blocks.

  • If the value is near the number of rows, then the table is very randomly ordered. In this case, it is unlikely that index entries in the same leaf block point to rows in the same data blocks.



분리형 데이블의 구조가 가지는 최대의 특징은 바로 데이터의 값에 전혀 무관하게 '임의의 위치'에 저장된다는 것이다. 이는 우리가 원하는 값을 찾으려면 필연적으로 여러곳을 찾아보야야 한다는 것을 의미한다.
여기서 논리적 용어인 '임의의 위치'라는 의미를 다른뜻으로 해석해 보면 물리적으로 위치할 수 있는 방법은 너무 다양할 수 있음을 뜻한다. 즉, 아무 곳에 있어도 된다는 뜻은 곧 그들이 있어야 할 위치가 다양한 블록에 흩어져 있을 수 있음을 의미한다.
그렇다면 그들이 흩어져 있는 정도에 따라, 다시 말해서 찾고자 하는 값들이 얼마나 가까운 위치에 모여 있느냐의 정도에 따라 차이가 발생할 수 있다. 가령 1부터 10까지의 데이터가 10개의 블록에 흩어져 저장되어 있는 경우와 2개의 블록에 모여 있는 경우를 비교했을 때 비록 논리적인 액세스 건수는 동일하지만 물리적 액세스에는 5배의 차이가 난다.
관계형 데이터베이스에서는 어떠한 경우에라도 최소한 하나의 블록은 액세스 되어야 한다.
비록 우리는 로우를 액세스하지만 실제로는 블록이 액세스된다. 그러므로 만약 이미 액세스해 두었던 블록에서 원하는 로우를 찾을 확률이 높다면 물리적으로 액세스할 블록의 수는 분명히 줄어들 것이다.

시스템 환경에 따라 차이는 있겠지만 일반적으로 메모리에 있는 블록에서 원하는 데이터를 찾는 것과 디스크에 있는 블록에서 찾는 것은 30배 이상 차이가 날 수도 있다. 그렇다면 설사 임의의 위치에 흩어져 있더라도 얼마나 주변에 모여 있느냐에 따라 액세스 효율은 커다란 영향을 받게될 것이다.
물리적인 저장 방법이란 저장할 때 결정되는, 단 한가지의 형태로만 존재할 수 있는 것이기 때문에 액세스 조건에 따라 마음대로 저장을 다르게 할 수는 없다. 그러므로 액세스할 컬럼에 따라 현재 저장된 형태와의 모여이쓴 정도에는 차이가 날 수 밖에 없다. 이것은 마치 같은 형제들이지만 부모와 닮아 있는 정도는 차이가 있는 것과 유사하다고 할 수 있다.
이처럼 인덱스의 컬럼값으로 정렬되어 있는 인덱스 로우의 순서와 테이블에 저장되어 있는 데이터 로우의 위치가 얼마나 비슷한 순서로 저장되어 있느냐에 대한 정도를 나타내는 것을클러스터링 팩터(Clustering Factor)라고 한다.
클러스터링 팩터를 향상시키는 것은 이처럼 액세스 효율에 직접적인 영향을 미치기 때문에 모든 유형의 테이블의 구조에서도 항상 이 문제로 촉각을 곤두 세우게 된다.

인덱스는 인덱스컬럼과 ROWID로 정렬되어 있다. 물론 생성 시의 옵션에 따라 오름차순(Ascending)으로 정렬될 수도, 내림차순(Descending)으로 정렬될 수도 있다. 이러한 구조가 가지는 특징은 많은 액세스적인 특징과 밀접한 관련이 있다. 이 말은 곧 이러한 정렬을 하는것은 나름대로 매우 합리적인 이유를 가지고 있다는 것을 의미한다.
인덱스가 로우를 액세스하는 경우를 분석해 보면 블록별로 액세스가 발생하고, 같은 블록 내에 있는 로우의 위치는 순서를 지키고 있지 않다. ROWID로 정렬되었다는 것은 곧 물리적인 데이터 파일의 블록으로 정렬되고, 거기에서 다시 슬롯번호로 정렬되었다는 것을 뜻한다.
이처럼 블록으로 정렬되어 있기 때문에, 블록별로 액세스가 일어날 때 한 번의 블록 액세스로 최대한 많은 로우를 액세스 할 수 있데 한다는 것은 알 수가 있다. 비록 실제의 로우는 순서대로 저장되어 있지 않더라도 슬롯에 들어 있는 위치정보를 이용하면 언제라도 원하는 로우를 찾을 수 있다. 이것은 인덱스에 있는 ROWID의 정렬이 단지 슬롯번호의 정렬에 지나지 않지만 로우를 액세스 하는 데는 전혀 문제가 없음을 의미한다. 
클러스터링 팩터가 좋은 인덱스로 액세스를 하면 많은 로우를 액세스 하더라도 보다 적은 블록을 액세스 하게 되어 더 효율적일 수 있다. 이것은 이왕이면 자주 넓은 범위를 액세스해야 하는 경우에 유리하도록 저장을 해 두는 것이 무척 중요하다는 것을 의미한다.

빈번하게 넓은 범위를 액세스하는 순서로 데이터를 저장함으로써 클러스터링 팩터를 향상시키는 전략에는 여라가지가 있다.
저장 시의 과도한 비용을 감수하고라도 원하는 형태의 액세스를 위해 클러스터링 팩터를 높여주는 좀더 적극적인 방법들이 다양하게 있다. 가장 소극적인 방법은 지금 설명하고 있는 분리형의 구조처럼 저장형식에 강제적인 제약없이 임의의 위치에 저장하는 방식이다.

'DATA > Oracle' 카테고리의 다른 글

Full Outer Join  (0) 2009.02.24
오라클 테이블 락 ( Table lock )  (0) 2009.01.30
ORA-28000 발생시 해결법  (2) 2009.01.30
Enqueue 와 Latch  (0) 2008.11.19
Materialized view  (0) 2008.01.16