반응형
Oracle 데이터베이스에서 가장 기본이 되는 테이블 구조인 힙 구성 테이블(Heap-Organized Tables)에 대해 상세히 알아보겠습니다. 실무에서 자주 사용되는 예제와 함께 설명드리겠습니다.
1. 힙 구성 테이블이란?
힙 구성 테이블은 Oracle의 기본 테이블 구조로, 데이터가 특별한 순서 없이 저장되는 방식입니다. 새로운 데이터는 테이블 세그먼트 내에서 사용 가능한 첫 번째 공간에 저장됩니다.
1.1 주요 특징
- 데이터가 입력 순서와 무관하게 저장
- ROWID를 통한 데이터 위치 식별
- 유연한 저장 공간 관리
- 다양한 인덱스 전략 적용 가능
2. 테이블 생성과 기본 사용법
2.1 기본 테이블 생성
-- 직원 정보 테이블 생성
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
email VARCHAR2(100),
hire_date DATE,
salary NUMBER(8,2),
department_id NUMBER
);
-- 부서 정보 테이블 생성
CREATE TABLE departments (
department_id NUMBER PRIMARY KEY,
department_name VARCHAR2(100),
location_id NUMBER
);
2.2 데이터 관리
-- 데이터 입력
INSERT INTO departments VALUES (10, 'Administration', 1700);
INSERT INTO departments VALUES (20, 'Marketing', 1800);
INSERT INTO employees VALUES (
1, 'John', 'Smith', 'john.smith@email.com',
DATE '2023-01-15', 5000, 10
);
-- 데이터 수정
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 10;
-- 데이터 삭제
DELETE FROM employees
WHERE hire_date < DATE '2023-01-01';
3. 인덱스 활용
3.1 기본 인덱스 생성
-- 단일 컬럼 인덱스
CREATE INDEX idx_emp_email
ON employees(email);
-- 복합 인덱스
CREATE INDEX idx_emp_dept_hire
ON employees(department_id, hire_date);
-- 함수 기반 인덱스
CREATE INDEX idx_emp_upper_name
ON employees(UPPER(last_name));
3.2 인덱스 활용 예제
-- 인덱스를 활용한 조회
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.hire_date >= DATE '2023-01-01'
AND e.department_id = 10;
4. 실무 활용 사례
4.1 주문 관리 시스템
-- 주문 테이블
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
order_date DATE,
customer_id NUMBER,
total_amount NUMBER(10,2),
status VARCHAR2(20)
);
-- 주문 상세 테이블
CREATE TABLE order_items (
order_id NUMBER,
product_id NUMBER,
quantity NUMBER,
unit_price NUMBER(10,2),
CONSTRAINT pk_order_items PRIMARY KEY (order_id, product_id)
);
-- 인덱스 생성
CREATE INDEX idx_orders_customer
ON orders(customer_id);
CREATE INDEX idx_orders_date
ON orders(order_date);
-- 일별 매출 집계 예제
SELECT
TO_CHAR(order_date, 'YYYY-MM-DD') as sale_date,
COUNT(*) as order_count,
SUM(total_amount) as total_sales
FROM orders
WHERE order_date >= ADD_MONTHS(SYSDATE, -1)
GROUP BY TO_CHAR(order_date, 'YYYY-MM-DD')
ORDER BY sale_date;
4.2 로그 관리 시스템
-- 로그 테이블
CREATE TABLE application_logs (
log_id NUMBER GENERATED ALWAYS AS IDENTITY,
log_time TIMESTAMP,
log_level VARCHAR2(10),
module VARCHAR2(50),
message CLOB,
CONSTRAINT pk_app_logs PRIMARY KEY (log_id)
);
-- 파티션 적용
CREATE TABLE application_logs_part (
log_id NUMBER GENERATED ALWAYS AS IDENTITY,
log_time TIMESTAMP,
log_level VARCHAR2(10),
module VARCHAR2(50),
message CLOB,
CONSTRAINT pk_app_logs_part PRIMARY KEY (log_id)
)
PARTITION BY RANGE (log_time) (
PARTITION logs_2024_01 VALUES LESS THAN (DATE '2024-02-01'),
PARTITION logs_2024_02 VALUES LESS THAN (DATE '2024-03-01'),
PARTITION logs_future VALUES LESS THAN (MAXVALUE)
);
5. 성능 최적화
5.1 테이블 분석
-- 테이블 통계 수집
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCOTT',
tabname => 'ORDERS',
estimate_percent => 100,
method_opt => 'FOR ALL COLUMNS SIZE AUTO'
);
END;
/
-- 테이블 재구성
ALTER TABLE orders MOVE;
5.2 공간 관리
-- 테이블 압축
ALTER TABLE orders MOVE COMPRESS FOR ALL OPERATIONS;
-- 공간 회수
ALTER TABLE orders SHRINK SPACE CASCADE;
-- 공간 사용량 확인
SELECT segment_name,
bytes/1024/1024 as size_mb,
blocks,
extents
FROM user_segments
WHERE segment_type = 'TABLE';
6. 모니터링 및 관리
6.1 테이블 모니터링
-- 테이블 상태 확인
SELECT table_name,
num_rows,
blocks,
empty_blocks,
avg_row_len
FROM user_tables
WHERE table_name = 'ORDERS';
-- 세그먼트 사용량 확인
SELECT segment_name,
segment_type,
bytes/1024/1024 as size_mb,
blocks,
extents,
max_extents
FROM user_segments
WHERE segment_name = 'ORDERS';
7. 성능 최적화 팁
- 적절한 초기 크기 설정
-- 초기 크기를 지정한 테이블 생성
CREATE TABLE large_table (
id NUMBER,
data VARCHAR2(1000)
)
STORAGE (
INITIAL 64K
NEXT 1M
MAXEXTENTS UNLIMITED
);
2. 병렬처리활용
-- 병렬 처리를 이용한 대량 데이터 처리
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(orders,4) */ INTO orders
SELECT /*+ PARALLEL(4) */ * FROM orders_staging;
8. 베스트 프랙티스
- 적절한 데이터 타입 선택
- NUMBER vs VARCHAR2 선택
- DATE vs TIMESTAMP 결정
- CHAR vs VARCHAR2 구분
- 인덱스 전략
- 필요한 컬럼만 인덱스 생성
- 복합 인덱스 순서 최적화
- 인덱스 개수 적정화
- 정기적인 유지보수
- 통계 정보 갱신
- 테이블 재구성 검토
- 불필요한 데이터 아카이빙
힙 구성 테이블은 Oracle 데이터베이스에서 가장 기본적이면서도 강력한 테이블 구조입니다. 적절한 설계와 관리를 통해 대부분의 업무 요구사항을 효과적으로 처리할 수 있습니다. 특히 일반적인 OLTP 환경에서는 힙 구성 테이블이 최적의 선택이 될 수 있습니다.
반응형