본문 바로가기

DB/Oracle

[Oracle] Cluster

- 클러스터

테이블의 데이터를 저장하는 방법으로서, 클러스터 키라고 부르는 공통된 칼럼을 기준으로  하나 이상의 테이블 데이터를 동일한 데이터 블록에 모아서 저장하는 기능

- 인덱스가 필수로 존재, 분포도가 나쁠수록 성능이 뛰어남

- 데이터가 대용량일 경우, PARTITION화

- 클러스터 인덱스를 생성하기 전에는 어떤 DML문장도 실행되지 않음

- 검색 효율을 높이나 DML(INSERT) 실행시 오버헤드 발생

- 클러스터 인덱스를 DROP하면 QUERY 실행 X

- 테이블스페이스를 변경하려면 DROP후 재생성

 

○ 선정기준

① 6블록 이상의 데이터를 지닌 테이블

② 다량의 범위를 자주 ACCESS하는 경우

③ 분포도가 나빠 인덱스를 사용한 처리가 부담될 경우

④ 여러 테이블이 빈번히 조인될 경우

⑤ 반복 칼럼이 정규화를 통해 분할된 경우

⑥  UNIION, DISTINCT, ORDER BY, GROUP BY 가 빈번히 사용된 칼럼

⑦ 수정이 자주 발생되지 않는 칼럼

⑧ 처리범위가 넓어 문제가 되는 경우 => 단일 테이블 클러스터링

⑨ 조인이 많아 문제가 되는 경우  => 다중 테이블 클러스터링

 

- Cluster 생성

클러스터는 다수개의 테이블을 하나의 오라클 블록에 저장하는 메커니즘이며, 클러스터 인덱스를 꼭 필요로 한다.

 

EX)

다음은 클러스터와 그 클러스터 인덱스를 생성하고, 클러스터 테이블을 생성하는 예제로, 예를 들어 IDNUM 컬럼을 공유하는 두 테이블 T1과 T2가 있다고 가정하고, 이들을 클러스터링 하려고 한다면 다음과 같을 것이다.


1. 클러스터를 생성한다.

CREATE CLUSTER cluster (column data_type, ... )
[PCTUSED int]
[PCTFREE int]
[INITRANS int]
[MAXTRANS int]
[SIZE int [K or M]]
[TABLESPACE tablespace]
[STORAGE storage_clause]

- PCTUSED & PCTFREE : 오직 클러스터 그 자체에 적용되는 block 파라미터
- SIZE: Cluster와 그 해당 데이터 행을 모두 저장하기 위해 필요한 스페이스를 나타낸다.

CREATE CLUSTER cluster_T1_T2 (IDNUM NUMBER(3))
SIZE 400
TABLESPACE DATA1
STORAGE (INITIAL 30K);

Cluster created.


2. 클러스터 인덱스를 생성한다.

CREATE INDEX index
ON CLUSTER cluster
[INITRANS int]
[MAXTRANS int]
[TABLESPACE tablespace]
[STORAGE storage_clause]
[PCTFREE int]
[NOSORT]

- 클러스터 인덱스의 생성은 일반 인덱스 생성과 크게 다르지 않으며 CREATE INDEX 뒤에 ON CLUSTER 옵션을 붙여서 클러스터 인덱스 생성임을 명시한다.
- 클러스터 인덱스의 생성도 일반 인덱스 생성과 같이 PCTUSED를 사용할 수 없다.

CREATE INDEX ind_cluster_T1_T2
ON CLUSTER cluster_T1_T2
TABLESPACE IDX1;

Index created.


3. 클러스터 테이블들을 생성한다

일반 테이블 생성방법과 같으며 뒤에 사용할 클러스터 명을 명시하여 생성한다. 

CREATE TABLE T1 (name VARCHAR2(10),
hire_date DATE,
IDNUM NUMBER(3)
)
CLUSTER cluster_T1_T2 (IDNUM);

Table created.

CREATE TABLE T2 (
IDNUM NUMBER(3),
idname VARCHAR2(10)
)
CLUSTER cluster_T1_T2 (IDNUM);

Table created.

이렇게 생성된 테이블 T1과 T2의 데이터는 같은 데이터 블록에 저장되게 된다.

 

- Cluster 삭제

클러스터의 삭제 전에 클러스터화된 테이블의 삭제가 먼저 이루어 지는 것이 좋다.

DROP CLUSTER SQL문 문법

DROP CLUSTER cluster_name INCLUDING TABLE CASCADE CONSTRAINTS;

- INCLUDING TABLE : 클러스터로 그룹화된 테이블이 아직 남아 있는 상태에서 이 옵션없이 클러스터를 삭제하면 에러가 발생한다.
- CASCADE CONSTRAINTS : 클러스터로 그룹화된 테이블에 Referential Integrity 제약 조건이 지정되어 있을 때 이 옵션없이 클러스터 삭제 시 에러 발생


• 클러스터를 삭제하면 클러스터내의 모든 테이블과 클러스터 인덱스가 같이 삭제된다.
• 클러스터 삭제 시, 그 클러스터에 사용되었던 모든 Extents는 그 소속 테이블스페이스에 return 된다.