반응형
클러스터 테이블은 관련된 데이터를 물리적으로 같은 위치에 저장하여 조인 성능을 최적화하는 Oracle의 특별한 저장 구조입니다.
1. 클러스터 테이블 개요
1.1 주요 특징
- 관련 데이터를 같은 데이터 블록에 저장
- 조인 성능 향상
- 디스크 I/O 감소
- 저장 공간 효율성 향상
1.2 클러스터 유형
- 인덱스 클러스터
- 클러스터 키에 인덱스 사용
- 가장 일반적인 유형
- 해시 클러스터
- 해시 함수로 데이터 위치 결정
- 정확한 일치 검색에 최적화
2. 클러스터 테이블 생성
2.1 인덱스 클러스터
-- 클러스터 생성
CREATE CLUSTER emp_dept_cluster (
department_id NUMBER(4)
)
SIZE 1024
TABLESPACE users;
-- 클러스터 인덱스 생성
CREATE INDEX idx_emp_dept_cluster
ON CLUSTER emp_dept_cluster;
-- 클러스터의 첫 번째 테이블 생성
CREATE TABLE departments (
department_id NUMBER(4) PRIMARY KEY,
department_name VARCHAR2(30),
location_id NUMBER(4)
)
CLUSTER emp_dept_cluster (department_id);
-- 클러스터의 두 번째 테이블 생성
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
first_name VARCHAR2(20),
department_id NUMBER(4),
salary NUMBER(8,2)
)
CLUSTER emp_dept_cluster (department_id);
2.2 해시 클러스터
-- 해시 클러스터 생성
CREATE CLUSTER order_cluster (
order_id NUMBER(10)
)
SIZE 1024
HASHKEYS 10000;
-- 해시 클러스터의 테이블 생성
CREATE TABLE orders (
order_id NUMBER(10) PRIMARY KEY,
customer_id NUMBER(10),
order_date DATE
)
CLUSTER order_cluster (order_id);
CREATE TABLE order_items (
order_id NUMBER(10),
line_item_id NUMBER(4),
product_id NUMBER(10),
quantity NUMBER(8)
)
CLUSTER order_cluster (order_id);
3. 활용 사례
3.1 부서-직원 데이터 클러스터링
-- 클러스터 생성
CREATE CLUSTER hr_cluster (
dept_id NUMBER(4)
)
SIZE 1024
TABLESPACE users;
CREATE INDEX idx_hr_cluster ON CLUSTER hr_cluster;
-- 부서 테이블
CREATE TABLE dept (
dept_id NUMBER(4) PRIMARY KEY,
dept_name VARCHAR2(30)
)
CLUSTER hr_cluster (dept_id);
-- 직원 테이블
CREATE TABLE emp (
emp_id NUMBER(6) PRIMARY KEY,
emp_name VARCHAR2(50),
dept_id NUMBER(4)
)
CLUSTER hr_cluster (dept_id);
-- 클러스터 테이블 조회
SELECT e.emp_name, d.dept_name
FROM emp e, dept d
WHERE e.dept_id = d.dept_id;
3.2 주문-주문상세 클러스터링
-- 해시 클러스터 생성
CREATE CLUSTER sales_cluster (
order_no NUMBER(10)
)
SIZE 1024
HASHKEYS 100000;
-- 주문 테이블
CREATE TABLE orders (
order_no NUMBER(10) PRIMARY KEY,
order_date DATE,
customer_id NUMBER(10)
)
CLUSTER sales_cluster (order_no);
-- 주문상세 테이블
CREATE TABLE order_details (
order_no NUMBER(10),
line_no NUMBER(4),
product_id NUMBER(10),
quantity NUMBER(8)
)
CLUSTER sales_cluster (order_no);
4. 성능 최적화
4.1 클러스터 크기 설정
-- 적절한 클러스터 크기 설정
CREATE CLUSTER customer_order_cluster (
customer_id NUMBER(10)
)
SIZE 8192 -- 8K 블록 크기
TABLESPACE users;
4.2 해시 키 개수 설정
-- 예상 데이터량을 고려한 해시 키 설정
CREATE CLUSTER product_cluster (
product_id NUMBER(10)
)
SIZE 4096
HASHKEYS 50000 -- 예상 제품 수의 1.5배
TABLESPACE users;
5. 모니터링 및 관리
5.1 클러스터 정보 조회
-- 클러스터 정보 확인
SELECT cluster_name, cluster_type, key_size
FROM USER_CLUSTERS;
-- 클러스터 사용량 확인
SELECT cluster_name, tablespace_name,
avg_blocks_per_key, avg_data_blocks_per_key
FROM USER_CLUSTERS;
5.2 클러스터 통계 수집
-- 클러스터 통계 수집
BEGIN
DBMS_STATS.GATHER_CLUSTER_STATS(
ownname => 'SCOTT',
clustname => 'EMP_DEPT_CLUSTER',
estimate_percent => 100
);
END;
/
6. 설계 고려사항
6.1 클러스터 사용이 적합한 경우
- 자주 조인되는 테이블들
- 부서-직원
- 주문-주문상세
- 고객-주소
- 클러스터 키로 주로 조회하는 경우
- 1:N 관계에서 부모 테이블 기준 조회
- 특정 키값으로 관련 데이터를 한꺼번에 조회
6.2 클러스터 사용을 피해야 하는 경우
- 데이터가 자주 변경되는 경우
- 클러스터 키가 아닌 컬럼으로 주로 조회하는 경우
- 테이블 간 관계가 복잡한 경우
7. 성능 분석
7.1 실행 계획 분석
-- 클러스터 테이블 조인 실행 계획
EXPLAIN PLAN FOR
SELECT e.emp_name, d.dept_name
FROM emp e, dept d
WHERE e.dept_id = d.dept_id;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
7.2 클러스터 효율성 분석
-- 클러스터 체인 분석
SELECT chain_cnt, avg_chain_len
FROM USER_CLUSTER_HASH_EXPRESSIONS
WHERE cluster_name = 'ORDER_CLUSTER';
8. 베스트 프랙티스
- 클러스터 키 선택
- 적절한 카디널리티
- 자주 사용되는 조인 조건
- 변경이 적은 컬럼
- 크기 설정
- 평균 로우 크기 고려
- 예상 성장률 반영
- 적절한 버퍼링 팩터
- 유지보수
- 정기적인 통계 수집
- 체인 발생 모니터링
- 주기적인 재구성 검토
클러스터 테이블은 관련된 데이터를 물리적으로 가깝게 저장함으로써 조인 성능을 크게 향상시킬 수 있는 강력한 기능입니다. 하지만 적절한 사용 케이스 선정과 세심한 설계가 성공적인 구현의 핵심입니다. 특히 데이터의 접근 패턴과 변경 빈도를 충분히 고려하여 클러스터 사용 여부를 결정해야 합니다.
반응형