Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-18
제목 CLUSTER에 관하여
CLUSTER에 관하여

1. cluster

<클러스터의 정의>

여러 테이블들에 공통되는 column이 있을때 그 컬럼의 데이타는 공유하면서 나머지
table의 row들을 하나의 block에 기록하는 저장방법


<클러스터의 두가지 장점>

다른 테이블의 row들을 하나의 block에 저장하므로 다음의 이점이 있다.
- clustered table끼리의 join에서의 속도의 향상
- cluster key는 한번만 저장되므로 storage의 향상

* Cluster는 그에 포함된 table을 다루는데 있어서 application design에 전혀 영향을 주지 않는다.


<어떤때 클러스터를 이용해야 하는가>

- referential integrity constraints가 있을때

- join condition에 의해 multiple table로 부터 cluster key가 될 컬럼이 자주 사용될때


<클러스터 사용시 DML문장>

Insert, Update, Delete 문장을 실행시 single table일때보다 많은 block을 읽어들여야 하므로 속도에 있어서 저하가 올 수 있다.


<하나의 테이블에 대한 clustering>

application이 EMP table을 access할때 deptno별로 access하는 경우가 자주 있다면
clustering시 유용한 결과





하나의 클러스터 키에 의해 사용되는 평균 space를 지정한다.

size에 의해 하나의 data block이 포함 할 수 있는 최대 cluster key의 개수가 판명된다.

만약 size가 한 block의 available space보다 크면 하나의 cluster키는 하나의 data block을 사용한다.

Example

block size 2k에서 1700 byte가 사용 가능한 공간일때
cluster key size가 500 이면
3개의 cluster키가 한 block에 저장될 수 있다.
하나의 block에서 사용될 cluster key의 maximum 개수는 제한하지만 반드시 3개의 cluster
key가 존재해야 하는 것은 아니며 하나의 cluster key가 하나의 block 전체를 사용할 수 있다.




. clustered table이 공통으로 가지고 있는 컬럼
. cluster key의 개수는 16개 이상이 되어서는 안된다.
. cluster key의 space는 database block의 1/2을 초과해서는 안된다.
. cluster key에 대한 update는 허용되지만 update된 row는 relocation 작업이 수행되어야 한다.
( test 결과 rowid에 대한 변화는 없으며 pointer를 변화시키는 것으로 추정됨)



. 충분한 unique value
. 하나의 cluster key에 대해 각 테이블의 row들이 최대한 하나의 block에 들어갈 정도가 되어야 한다
. column의 key 값이 male, female과 같이 너무 general한 값을 가지고 있으면 performance가 떨어짐.



2. index cluster



indexed cluster에서는 cluster를 생성후 cluster index를 생성해야 한다.
일반 index에서와 같이 cluster key value에 대한 index entry를 갖는다.


<일반 table index와 다른점>

- 모두 null인 keys에 대해서도 cluster index가 생성된다.
- index entry는 overflow가 일어났을때에는 cluster key가 있는 첫번째 block을 가리키는 pointer를 갖는다.
- 즉 cluster의 각 row에 대해서 entry를 갖는 것이 아니라 cluster key에 대해서만 entry를 갖는다. 일반 index는 없어도 되지만 cluster index는 없으면 안됨.




- join statement에서 자주 나타나는 테이블들
- table join이 가끔일어나거나 common column value들이 자주 update가 일어난다면
cluster를 사용하지 않는다.
- full table scan을 자주한다면 cluster를 사용하지 않는다.
( full table scan을 위해서는 하나의 테이블에서 읽는 것보다 더 많은 테이블을 읽어들여야 한다)
- master detail 로 묶여진 테이블인 경우 cluster로 묶으면 속도의 향상.
어떤 master table의 detail records만을 자주 select한다면 detail table만 cluster로 저장할 수 있다. 이렇게 하면 master table의 full table scan시 속도의 저하를 막을 수 있다.
- 어떤 cluster key에 대해 모든 cluster table로 부터의 data가 1 - 2 block의 크기를 넘을때는 cluster로 하지 않는다.
하나의 row를 select하기 위해 전체 multiple block을 읽어야 한다.



3. hash cluster



원하는 레코드를 쉽게 탐색하기 위해 특정 레코드의 키값과 그 레코드의 위치사이에
어떤 관계를 지어두고 레코드를 삽입하거나 탐색할때 이러한 관계를 사용 하는 방법을 hashing이라 하며 이때 사용되는 방법을 hash function이라한다.




hash function을 이용하여 cluster key column에 대한 row를 찾아간다.
hash function(cluster key value) --> hash key value
어떤 rows를 입력하거나 찾기 위해 hash function을 이용한다
resulting hash value를 이용하여 cluster의 data block을 찾아 간다.





hash value의 전체 개수를 말한다.
round HASHKEYS to nearest prime number



두개의 cluster value들이 같은 hash value를 갖는 경우를 말한다.
large hashkeys ---> collision decrease



indexed cluster와 같은 내용이나 같은 size내에 저장되는 내용은 같은 cluster key value를 갖는 것이 아니라 같은 hash key value를 갖는 것이 저장된다. 즉 hash column의 내용들은 다른 값을 가질 수 있다.

각 row의 hash key value는 저장되지 않지만 cluster key value는 저장된다.
( storage 효율의 저하 )



hash value를 구하여 원하는 data block을 찾아갈 수 있도록 한다.
maximum distribution of rows ---> to minimize collision


single column이나 composite key가 가능하다.
column datatype으로 long이나 long raw를 제외한 모든 datatype 사용 가능
최소의 collision을 위해 설계되었음.
for each column
for each byte in the column
calculate a hash value using the hash value previous bytes
ie. hash value = hash value * (randomized bit shifting algorithm)
if any column value is NULL, a certain default value is used


uniformly distributed unique identifier
hash value = cluster key value mod number of hashkeys
이때의 cluster key value는 항상 integer이어야 한다.



최초 cluster가 생성될때 hash table이 생성되어 hash key는 물리적인 위치와 mapping된다.

hash cluster의 initial space allocation은 SIZE * HASHKEYS 의 크기이다.
( 실제로는 한 block에 몇개의 hash key가 들어가느냐에 좌우됨.)

최초 initial storage이후의 공간은 이미 full이된 data block의 overflow을 위한 것이다. ( root block에 chain 된다. )

frequent collision --> large overflow blocks ---> reducing retrieval performance




where 절에 equality condition을 자주 사용하는 문장에 의해 자주 access되는 테이블 select ... when cluster_key = ...;
전체 사용량의 추정 가능 한 경우




계속해서 증가하는 테이블을 저장하기 위해서는 cluster를 사용하지 말것.
full table scan 을 자주하는 table은 cluster를 만들지 말것.
cluster key value를 자주 변경하는 application이라면 cluster를 사용하지 말것.
미리 전체 cluster의 공간을 allocate할 수 없을때
cluster key에 대해 range scan을 하는 경우
select ... where cluster_key < ... ;
Comment
등록된 코멘트가 없습니다.