create cluster mechultc1 (deptno number(2))
size 8600
tablespace test_data_sp ;
create index mechultc1_idx on cluster mechultc1
tablespace test_index_sp ;
create table mechultc1_tbl (empno varchar(04),
deptno number(02),
sale_date varchar(8),
qty number)
cluster mechultc1 (deptno);
클러스터 인덱스와 보통 인덱스의 비교
출처 : 이화식(대용량데이터베이스솔류션)PPT자료
| 인덱스(Index) | 클러스터(Cluster) |
|---|---|
| 인덱스는 테이블의 로우의 ROWID별로 하나씩의 인덱스를 가짐 | 클러스터는 클러스터링된 값(Cluster Key)마다 하나씩의 클러스터 인덱스 로우를 가짐 |
| NULL 값을 저장하지 않음 | NULL 값을 저장함 |
클러스터링이란?
클러스터링이란 어떤 정해진 컬럼을 기준으로 동일한 값을 가진 모든 로우를 같은 장소에 저장하여 같은 값을 가지는 여러 로우를 액세스할 때 랜덤액세스를 최소화함으로써 액세스효율을 개선시키는 물리적인 저장기법이다
Note
궁금한점 : 일반 인덱스테이블의 클러스터링팩터를 좋게 한다면 클러스터링 테이블액세스와 비교가 될까?
단일 테이블 클러스터 테스트
| 단일테이블 클러스터링 |
|---|
| 다중테이블 클러스터링 |
|---|
클러스터링된 테이블의 삭제방법 - 클러스터내의 테이블 삭제의 경우
삭제할 내용을 충분히 담을 수 있는 큰 롤백 세그먼트를 가지고 있어야 하며 작업전에 다음과 같은 명령어로 별도(충분한)의 롤백 세그먼트를 지정하여야 한다.
SET TRANSACTION USE ROLLBACK SEGMENT large_rollback_segment_name;
만약 충분히 큰 롤백 세그먼트를 가지고 있지 않다면 분할하여 로우를 삭제시킨 후 테이블을 삭제시켜야 한다.
DELETE FROM table WHERE ROWNUM < 1000000;
∑_(table=1)^n▒(table 평균로우길이* 클러스터 키당 평균 로우 수)
쉽게 이렇게도 한다.
(table평균로우길이*클러스터 키당 평균 로우수) * 1.1
SELECT SUM(COUNT★)
FROM MECHULT
WHERE SALE_DATE BETWEEN '20000101'
AND '20071231'
AND SALE_DEPT= 20
SELECT SUM(COUNT★)
FROM MECHULT
WHERE SALE_DATE BETWEEN '20000101'
AND '20071231'
AND RTRIM(SALE_DEPT) = 20
SELECT /*+ CLUSTER(MECHULT) */
SUM(COUNT★)
FROM MECHULT
WHERE SALE_DATE BETWEEN '20000101'
AND '20071231'
AND SALE_DEPT = 20