Oracle 컬럼의 물리적 구조
개요
Oracle Database에서 컬럼의 물리적 저장 구조는 성능과 저장 효율성에 직접적인 영향을 미치는 핵심 아키텍처 요소입니다. 이 문서는 DBA 및 데이터베이스 전문가를 대상으로 컬럼의 바이트 레벨 저장 구조부터 성능 최적화까지 상세히 다룹니다.
Row Format Architecture
Row Header Structure (3 bytes)
| Byte Position | Field | Description | Bit Layout |
|---|---|---|---|
| Byte 0 | Row Flags | 행 상태 정보 | 8 bits |
| Byte 1-2 | Column Count + Flags | 저장된 컬럼 수 및 추가 플래그 | 16 bits |
Row Flags (Byte 0) 상세 분석:
Bit 0: Row is deleted (삭제된 행) Bit 1: Row is locked (행 잠금) Bit 2: Row has migrated (행 이주) Bit 3: Row is head of row piece chain (체인 헤드) Bit 4: Row is clustered table member (클러스터 테이블 멤버) Bit 5-7: Reserved for future use
Column Length Array
Oracle은 Variable Length Array 방식으로 각 컬럼의 길이 정보를 저장합니다:
- NULL 컬럼: Length Array에서 완전히 제외
- Non-NULL 컬럼: 1바이트 길이 정보 (최대 250바이트)
- 대용량 컬럼: 3바이트 확장 길이 정보
Length Encoding Rules: - 0x00-0xFA (0-250): 직접 길이 값 - 0xFB-0xFE: 확장 길이 인코딩 - 0xFF: NULL 값 (실제로는 저장되지 않음)
Data Type별 물리적 저장 구조
NUMBER 데이터 타입
Oracle의 NUMBER 타입은 독특한 Binary Coded Decimal (BCD) 변형을 사용합니다:
| 값 | 저장 바이트 | 설명 |
|---|---|---|
| 0 | 0x80 | 특수한 zero 표현 |
| 1-99 | 2-3 바이트 | 지수 + 가수부 |
| 100-9999 | 3-4 바이트 | 지수 + 가수부 |
| 매우 큰 수 | 최대 22바이트 | Oracle 내부 정밀도 한계 |
NUMBER 인코딩 알고리즘:
1. Sign bit 처리 2. Exponent calculation (bias 193 for positive, bias 62 for negative) 3. Mantissa encoding (base-100 digit pairs) 4. Trailing zero elimination
VARCHAR2 vs CHAR 저장 차이점
| 데이터 타입 | 저장 방식 | Trailing Spaces | Length Encoding |
|---|---|---|---|
| VARCHAR2 | Variable | 제거됨 | Actual length only |
| CHAR | Fixed | 보존됨 | Declared length |
| NVARCHAR2 | Variable | 제거됨 | UTF-16 byte length |
| NCHAR | Fixed | 보존됨 | UTF-16 declared length |
DATE와 TIMESTAMP 구조
DATE 타입 (7 바이트 고정):
Byte 1: Century + 100 (범위: 01-FF) Byte 2: Year in century + 100 (범위: 01-64) Byte 3: Month (범위: 01-0C) Byte 4: Day (범위: 01-1F) Byte 5: Hour + 1 (범위: 01-18) Byte 6: Minute + 1 (범위: 01-3C) Byte 7: Second + 1 (범위: 01-3C)
TIMESTAMP 확장 구조:
- TIMESTAMP(6): DATE 7바이트 + Fractional seconds 4바이트
- TIMESTAMP WITH TIME ZONE: 추가로 timezone 정보 2바이트
- TIMESTAMP WITH LOCAL TIME ZONE: 내부적으로 UTC 저장
Column Ordering과 Performance Impact
물리적 배치 최적화 전략
권장 컬럼 순서:
- Primary Key (항상 NOT NULL, 고정 크기 선호)
- Foreign Keys (조인 성능 최적화)
- 자주 접근되는 NOT NULL 컬럼들 (WHERE절 조건)
- 선택적 고정 크기 컬럼들
- 가변 크기 컬럼들 (크기 순으로 정렬)
- 대용량 LOB 컬럼들 (별도 세그먼트 고려)
Row Access Path Analysis
컬럼 접근 시 Oracle의 내부 처리 과정:
1. Row Header 파싱 (3 바이트) 2. Target column의 테이블 정의상 위치 확인 3. Length Array 순차 스캔 (NULL 컬럼 건너뛰기) 4. Offset 계산 및 데이터 추출 5. 데이터 타입별 디코딩
성능 측정 지표:
- Logical I/O: db block gets + consistent gets
- CPU 사용량: 컬럼 접근 및 변환 비용
- Memory 효율성: Buffer cache 활용도
Advanced Storage Concepts
Row Chaining과 Migration
Row Chaining 발생 조건:
- Row 크기가 block 크기 초과
- 초기 INSERT 시점에 이미 발생
- 해결책: block 크기 증가 또는 테이블 분할
Row Migration 시나리오:
Before Update: [Block A] Row fits completely After Update: [Block A] Forwarding pointer → [Block B] Actual row data Performance Impact: 2x I/O cost for row access
Compression과 컬럼 구조
Advanced Compression 영향:
- Basic Compression: 블록 레벨 압축, 컬럼 순서 중요
- OLTP Compression: 행 레벨 압축, 반복 패턴 최적화
- Hybrid Columnar Compression: 컬럼 단위 압축, Exadata 전용
| 압축 타입 | 컬럼 순서 영향도 | 권장 사용처 |
|---|---|---|
| BASIC | 높음 | Data Warehouse |
| OLTP | 중간 | OLTP 환경 |
| HCC | 낮음 | Exadata 환경 |
Monitoring과 Diagnostics
Row 구조 분석 도구
DUMP 함수 활용:
SELECT DUMP(column_name, 16) FROM table_name; -- 16진수 표현으로 internal 구조 확인 SELECT DUMP(column_name, 8, 1, 4) FROM table_name; -- 8진수, 1번째부터 4바이트까지 분석
Block Dump 명령어:
ALTER SYSTEM DUMP DATAFILE 4 BLOCK 1234; -- Physical block structure 확인 -- alert log에서 덤프 결과 확인
Performance 모니터링 쿼리
Row Access Pattern 분석:
SELECT
sql_id,
operation,
object_name,
cost,
cardinality,
access_predicates
FROM v$sql_plan
WHERE object_name = 'TABLE_NAME'
AND operation LIKE '%TABLE ACCESS%';
Block 사용량 통계:
SELECT
table_name,
num_rows,
blocks,
avg_row_len,
chain_cnt,
ROUND(chain_cnt/num_rows*100, 2) as chain_pct
FROM user_tables
WHERE chain_cnt > 0;
실무 최적화 가이드라인
설계 단계 고려사항
테이블 설계 체크리스트:
- NOT NULL 컬럼의 전방 배치 여부
- 가변 길이 컬럼의 예상 크기 분포
- Update 빈도가 높은 컬럼의 배치
- 조인 키 컬럼의 데이터 타입 일치성
- LOB 컬럼의 별도 저장 고려
운영 단계 모니터링
주기적 점검 항목:
- Row migration 비율 (>10%시 재구성 고려)
- Average row length 추이
- Block 사용률 (PCTFREE 조정)
- Index clustering factor (컬럼 순서 관련)
참고 자료
Oracle 내부 문서
- Oracle Database Concepts - Physical Storage Structures
- Oracle Database Performance Tuning Guide - Optimizing Data Access
- Oracle Database Utilities - Data Pump 고급 옵션
진단 뷰 및 함수
- V$SQL_PLAN: 실행계획 컬럼 접근 패턴
- DBA_SEGMENTS: 세그먼트 크기 및 구조
- DBMS_SPACE: 공간 사용량 분석
- DBMS_ROWID: Row 물리적 위치 분석