본문 바로가기

카테고리 없음

Oracle 힙 구성 테이블(Heap-Organized Tables) 완벽 가이드

반응형

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. 성능 최적화 팁

  1. 적절한 초기 크기 설정
-- 초기 크기를 지정한 테이블 생성
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. 베스트 프랙티스

  1. 적절한 데이터 타입 선택
    • NUMBER vs VARCHAR2 선택
    • DATE vs TIMESTAMP 결정
    • CHAR vs VARCHAR2 구분
  2. 인덱스 전략
    • 필요한 컬럼만 인덱스 생성
    • 복합 인덱스 순서 최적화
    • 인덱스 개수 적정화
  3. 정기적인 유지보수
    • 통계 정보 갱신
    • 테이블 재구성 검토
    • 불필요한 데이터 아카이빙

힙 구성 테이블은 Oracle 데이터베이스에서 가장 기본적이면서도 강력한 테이블 구조입니다. 적절한 설계와 관리를 통해 대부분의 업무 요구사항을 효과적으로 처리할 수 있습니다. 특히 일반적인 OLTP 환경에서는 힙 구성 테이블이 최적의 선택이 될 수 있습니다.

반응형